Maven, assembly-plugin的简单配置
问题展现
本地项目打包后,将 jar 包打入本地仓库。然后,供给其他项目使用,发现项目中的相关依赖包并未引入,而且其他项目在运行时出现错误 NoClassDefFoundError 问题。
本地项目引入logback依赖和maven-jar-plugin插件配置启动类
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
.
.
.
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>org.example.App</mainClass>
<addClasspath>true</addClasspath>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
项目使用依赖的api
mvn package打包产物如下
执行结果
java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory项目的相关依赖并没有一起打包进来所以找不到
解决问题
maven 打包时,默认不会将第三方依赖包打进来。可以在 pom.xml 中添加maven-assembly 插件实现… 打出的包里 xxxx-with-dependencies.jar 就是包含依赖包。
有时候需要启动一些小服务(类似脚本, 处理完结束任务).
引入插件
可能这时候, 不会再用SpringBoot那么大费周章. 所以就需要用'main'方法启动服务了.
如何指定'主类', 并将外部引用的依赖一齐打入jar包呢? 可参考下面的pom.xml中的<build/>片段:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifest>
<mainClass>org.example.App</mainClass>
</manifest>
<manifestEntries>
<Class-Path>.</Class-Path>
</manifestEntries>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id> <!-- this is used for inheritance merges -->
<phase>package</phase> <!-- bind to the packaging phase -->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
configuration中的manifest是配置启动类信息