gpt4 book ai didi

java - Maven 应用程序组装器插件 : change current directory before launching program

转载 作者:行者123 更新时间:2023-11-30 03:37:21 25 4
gpt4 key购买 nike

假设我有一个带有 Main.java 的简单 Spring 应用程序,如下所示:

public class Main {
public static void main(String[] args) {
AbstractApplicationContext context = new
FileSystemXmlApplicationContext("config/application-context.xml");
// do stuff...
}
}

我正在使用 Maven 构建项目并使用 appassembler 插件:

<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>appassembler-maven-plugin</artifactId>
<version>1.8</version>
<configuration>
<programs>
<program>
<mainClass>com.jonarcher.Main</mainClass>
<id>foo</id>
</program>
</programs>
<target>${project.build.directory}</target>
<repositoryLayout>flat</repositoryLayout>
<repositoryName>lib</repositoryName>
<configurationDirectory>config</configurationDirectory>
<configurationSourceDirectory>src/main/config</configurationSourceDirectory>
<copyConfigurationDirectory>true</copyConfigurationDirectory>
</configuration>
</plugin>

我的项目位于 $HOME/work/java/foo 所以我:

$ cd $HOME/work/java/foo
$ mvn clean package

... usual copious maven output ...

# make the script executable
$ chmod 755 target/appassembler/bin/foo

# run it
$ target/appassembler/bin/foo


# aw...FileNotFoundException!
16:42:21,329 INFO .support.FileSystemXmlApplicationContext: 515 - Refreshing org.springframework.context.support.FileSystemXmlApplicationContext@11831d18: startup date [Wed Dec 17 16:42:21 MST 2014]; root of context hierarchy
16:42:21,369 INFO eans.factory.xml.XmlBeanDefinitionReader: 316 - Loading XML bean definitions from file [/Users/jarcher/work/java/foo/config/application-context.xml]
Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from file [/Users/jarcher/work/java/foo/config/application-context.xml]; nested exception is java.io.FileNotFoundException: config/steve.xml (No such file or directory)

查看appassembler生成的foo脚本,我注意到它定义了一个$BASEDIR,它实际上是包含已组装应用程序的目录(即在我的例子中是 $HOME/work/java/foo/target/appassembler )。

尽管 $BASEDIR 已传递给程序调用,但它似乎错过了一个步骤,因为它没有首先 cd $BASEDIR...

exec "$JAVACMD" $JAVA_OPTS  \
-classpath "$CLASSPATH" \
-Dapp.name="steve" \
-Dapp.pid="$$" \
-Dapp.repo="$REPO" \
-Dapp.home="$BASEDIR" \
-Dbasedir="$BASEDIR" \
com.jonarcher.Main \
"$@"

好的,所以我可以:

$ cd $HOME/work/java/foo/target/appassembler # or wherever my app ultimately is installed
$ bin/foo

一切都很好,但我真的不希望人们必须在正确的目录中才能启动它(!)

所以我错过了什么吗?有没有办法可以轻松改变这种情况?难道是我想错了?

(我意识到我可以使用传入的 app.home 属性,但这只是一个级联的麻烦链......)

最佳答案

好吧,以防将来这对其他人有用,我可以更改用于生成脚本的模板以根据需要更改目录。

原始模板可以从 here 获取。放入您的项目并根据需要进行编辑。

然后只需将以下内容添加到应用程序组装器配置部分:

<configuration>
...
<unixScriptTemplate>${project.basedir}/path/to/script/template</unixScriptTemplate>
</configuration>

关于java - Maven 应用程序组装器插件 : change current directory before launching program,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27537676/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com