我使用appassembler-maven-plugin生成的启动脚本存在问题。我有一个只有一个类的基本的spring-boot应用程序:
@SpringBootApplication public class ScriptDemoApplication { public static void main(String[] args) { SpringApplication.run(ScriptDemoApplication.class, args); } }
和我的pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.home.sziolkow</groupId> <artifactId>script-demo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>script-demo</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.7</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <mainClass>${start-class}</mainClass> </configuration> <executions> <execution> <goals> <goal> repackage </goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>appassembler-maven-plugin</artifactId> <version>1.10</version> <configuration> <goal> package </goal> <showConsoleWindow> true </showConsoleWindow> <platforms> <platform>unix</platform> </platforms> <programs> <program> <mainClass>org.home.sziolkow.ScriptDemoApplication</mainClass> <id>app</id> </program> </programs> </configuration> </plugin> </plugins> </build> </project>
我用以下方法运行Maven: mvn package appassembler:assemble
mvn package appassembler:assemble
生成了程序包和脚本,但是当我尝试运行时./target/appassembler/bin/app,我得到了
./target/appassembler/bin/app
错误:找不到或加载主类org.home.sziolkow.ScriptDemoApplication
我测试了生成的软件包,并且可以启动应用程序而不会出现以下问题:
java -jar ./target/appassembler/repo/org/home/sziolkow/script-demo/0.0.1-SNAPSHOT/script-demo-0.0.1-SNAPSHOT.jar
由于Spring Boot重新打包JAR以使其成为可执行JAR的方式,您遇到了麻烦。从文档中:
可执行档案不能用作依赖项,因为可执行jar格式将打包应用程序类BOOT-INF/classes。这意味着当将可执行jar用作依赖项时,找不到它们。
BOOT-INF/classes
本质上,Spring Boot Maven插件将您的JAR重新打包,并将您的类放入BOOT-INF/classes,所有JAR依赖项放入其中BOOT- INF/lib,并将其JarLauncher类作为主类启动,它将在那些位置搜索类和JAR。
BOOT- INF/lib
JarLauncher
因此,您有两种解决方案:不要使用Spring Boot将JAR重新打包为可执行的JAR,或者根本不使用Appassembler插件。
由于Spring Boot为您创建了一个可执行JAR,因此不需要使用Appassembler插件生成脚本。删除的插件声明,appassembler- maven-plugin并具有:
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。启动时mvn clean package,您可以直接使用以下命令启动生成的可执行文件JAR:
<mainClass>
appassembler-maven-plugin
mvn clean package
java -jar target/script-demo-0.0.1-SNAPSHOT.jar
如果可执行文件名称中的0.0.1-SNAPSHOT版本存在问题,则可以<finalName>在POM中简单地设置a :
<finalName>
<build> <finalName>${project.artifactId}</finalName> <!-- ... --> </build>
然后将使用来启动可执行JAR java -jar target/script-demo.jar。
java -jar target/script-demo.jar
如前所述,由于Spring Boot的repackage目标是将类和JAR放在一个BOOT- INF文件夹中,因此我们需要摆脱它。因此,删除spring-boot-maven-plugin插件声明,并放入您的POM中:
repackage
BOOT- INF
spring-boot-maven-plugin
<plugin> <groupId>org.codehaus.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。然后,在运行时mvn clean package,您将能够使用由Appassembler生成的脚本来启动应用程序:
package
appassembler:assemble