由于Spring
Boot重新打包JAR以使其成为可执行JAR的方式,您遇到了麻烦。从文档中:
可执行档案不能用作依赖项,因为可执行jar格式将打包应用程序类
BOOT-INF/classes。这意味着当将可执行jar用作依赖项时,找不到它们。
本质上,Spring Boot Maven插件将您的JAR重新打包,并将您的类放入
BOOT-INF/classes,所有JAR依赖项放入其中
BOOT-INF/lib,并将其
JarLauncher类作为主类启动,它将在那些位置搜索类和JAR。
因此,您有两种解决方案:不要使用Spring Boot将JAR重新打包为可执行的JAR,或者根本不使用Appassembler插件。
没有Appassembler
由于Spring Boot为您创建了一个可执行JAR,因此不需要使用Appassembler插件生成脚本。删除的插件声明,
appassembler-maven-plugin并具有:
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <mainClass>org.home.sziolkow.scriptDemoApplication</mainClass> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions></plugin>
POM的唯一更改是添加了
<mainClass>指向您的主类的参数,并删除了
appassembler-maven-plugin。启动时
mvnclean package,您可以直接使用以下命令启动生成的可执行文件JAR:
java -jar target/script-demo-0.0.1-SNAPSHOT.jar
如果可执行文件名称中的0.0.1-SNAPSHOT版本存在问题,则可以
<finalName>在POM中简单地设置a :
<build> <finalName>${project.artifactId}</finalName> <!-- ... --></build>然后将使用来启动可执行JAR
java -jar target/script-demo.jar。
使用Appassembler
如前所述,由于Spring Boot的
repackage目标是将类和JAR放在一个
BOOT-INF文件夹中,因此我们需要摆脱它。因此,删除
spring-boot-maven-plugin插件声明,并放入您的POM中:
<plugin> <groupId>org.prehaus.mojo</groupId> <artifactId>appassembler-maven-plugin</artifactId> <version>1.10</version> <executions> <execution> <id>assemble</id> <goals> <goal>assemble</goal> </goals> <phase>package</phase> <configuration> <showConsoleWindow>true</showConsoleWindow> <platforms> <platform>unix</platform> </platforms> <programs> <program> <mainClass>org.home.sziolkow.scriptDemoApplication</mainClass> <id>app</id> </program> </programs> </configuration> </execution> </executions></plugin>
与当前POM的区别在于,Appassembler已绑定到该
package阶段,因此无需调用即可启动执行
appassembler:assemble。然后,在运行时
mvnclean package,您将能够使用由Appassembler生成的脚本来启动应用程序:
./target/appassembler/bin/app



