原文链接:http://2kuai3.com/article/5.html
在spring boot 开发中,用maven来管理,不论是eclipse来打包还是 idea打包都需要配置一下,且打包管理的依赖总是太麻烦,那今天就快速的解决打包问题,如在一个父项目在 有 A模块,B模块,C模块,A依赖B和C,需要对A打包,如何快速的把B和C一块也同步打包??
看了网上的许多文章,依然打不好包!!
原理:
java打包可运行jar,就是一个 压缩文件的jar,在MANIFEST.MF 中描述了启动文件的入口和所有依赖的jar文件位置,虽然 spring boot提供了maven的打包的插件,回归本质就是最简单的。
解决方案:
- 按如下配置 在 要打包的pom中,添加 如下三个 maven插件:maven-compiler-plugin、maven-dependency-plugin、maven-jar-plugin
- 按插件要求配置好 main文件的入口类名和项目要依赖 scope 是 system的jar文件 也配置到manifestEntries标签中,maven打包 不会自动把scope=system的jar依赖自动写入到MANIFEST.MF文件中,需要我们自己指定一下,切记
- 配置好后 ,maven-dependency-plugin 是把要依赖的jar都copy到lib文件夹中,包括依赖的其他源码模块一会一同打包,maven-jar-plugin 是打包可执行jar,在项目pom.xml的同级目录中执行命令: mvn clean package ,执行完毕后会在 target目录中 有 一个可执行jar和lib目录,直接 用java -jar xxx.jar 就可以执行了,
- 把 xxx.jar 和 lib一同发布到服务器,linux: nohup java -jar xxx.jar & 去执行吧,到此spring boot发布完毕,
看这里看这里
看这里
注:maven中依赖文件,scope为 system的jar包依赖,打包的时候依赖copy会按照artifactId和version
的配置对其 jar包进行重命名,jar包的名字将会变为:artifactId-version.jar ,如果其他地方用到了
这个jar的固定名字,请提前将jar的名字按 maven的标准进行命名!!!
如:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>alipay-sdk</artifactId>
<version>java20180309170622</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/alipay-sdk-java20180309170622.jar</systemPath>
</dependency>
文件名刚好 alipay-sdk-java20180309170622.jar = artifactId + version + .jar
如果 verson为2.0 则:这个 jar包打包后变为 alipay-sdk-2.jar 将和 本地的源文件名字不一致,如果在 其他xml中配置了要用到alipay-sdk-java20180309170622.jar 的文件名就会报错,java classNotDefException的异常 ClassNotFoundException的异常,如在manifestEntries 标签中用到。
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.company.project.Application</mainClass>
<!-- 入口程序 -->
<addClasspath>true</addClasspath>
<!-- 添加依赖jar路径 -->
<classpathPrefix>lib/</classpathPrefix>
</manifest>
<manifestEntries>
<Class-Path>lib/alipay-sdk-java20180309170622.jar</Class-Path>
</manifestEntries>
</archive>
</configuration>
</plugin>
</plugins>
</build>