Плагин Maven Appassembler: изменить текущий каталог перед запуском программы
Скажем, у меня есть простое приложение Spring с Main.java
вот так:
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)
Глядя на foo
сценарий, который appassembler
сгенерировал я заметил, что это определяет $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
свойство, которое передается, но это просто каскадная цепочка хлопот...)
1 ответ
Хорошо, если это пригодится кому-то еще в будущем, я смог изменить шаблон, использованный для генерации скрипта, чтобы изменить каталог, как я хотел.
Исходный шаблон можно зацепить отсюда. Поместите в свой проект и отредактируйте при необходимости.
А затем просто добавьте следующее в раздел конфигурации appassembler:
<configuration>
...
<unixScriptTemplate>${project.basedir}/path/to/script/template</unixScriptTemplate>
</configuration>