Springboot项⽬打包成jar运⾏2种⽅式
最近公司有个项⽬需要移植到SpringBoot框架上,项⽬⾥⾯⼜有许多第三⽅jar包,在linux服务器上最⽅便的就是⽤jar的⽅式来运⾏SpringBoot项⽬了,因此我研究了2种打jar包的⽅式,记录如下,供⼤家参考:
1、通过maven插件,将所有依赖包都打包成⼀个jar包,然后通过java -jar xxx.jar⽅式运⾏
由于项⽬中有些jar包是第三⽅的,maven官⽅仓库没有,需要使⽤mvn install命令打包到本地,然后将其写⼊到l的依赖中,maven 仓库有的jar包则从maven官⽹到对应版本的depdency写⼊pom⽂件⾥⾯,这样maven打包就可以包含第三⽅jar包了,否则maven只会打包pom⽂件⾥⾯的,不会包括第三⽅jar包,程序运⾏将报错。这⾥推荐2种打包第三⽅jar包的⽅式:
第⼀种:打包第三⽅jar包到本地仓库,然后在l中引⼊
例如:将alipay-sdk-abc.jar 打包到本地仓库
mvn命令:
m vn install:install-file -Dfile=G:\thirdpartyjar\alipay-sdk-abc.jar -DgroupId=com.thirdparty -DartifactId=alipay-sdk-abc -Dversion=3.1.0.8 -Dpackaging=jar
springboot aop
<dependency>
<groupId>com.thirdparty</groupId>
<artifactId>alipay-sdk-abc</artifactId>
<version>3.1.0.8</version>
</dependency>
然后在cmd或者IDEA的terminal⾥⾯使⽤mvn clean package -X命令清理、打包成jar⽂件,-X命令可以看到具体的打包输出,便于分析。这⾥⽤到了2个plugin,⼀个是普通的maven插件⽤于将各种jar包打包到⼀起,可是这样的jar包是⽆法运⾏的,因为jar包⾥⾯没有启动类信息,还需要SpringBoot的maven插件进⾏repackage,这样⽣成的jar包就包含启动信息,才可以运⾏,关键配置如下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerArgs>
<!-- 过期的⽅法的警告-->
<arg>-Xlint:deprecation</arg>
</compilerArgs>
<compilerArguments>
<!-- 是否输出所有的编译信息(包括类的加载等)-->
<!--<verbose />-->
<!-- 解决maven命令编译报错,因为rt.jar 和jce.jar在jre的lib下⾯,不在jdk的lib下⾯,
导致maven不到(java7以后会出现这个问题),将这2个jar包拷贝到jdk的lib下⾯估计也好使--> <bootclasspath>${java.home}/lib/rt.jar;${java.home}/lib/jce.jar</bootclasspath>
</compilerArguments>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
第⼆种:通过在l中指定第三⽅jar包路径来引⼊依赖
⽐如第三⽅jar包在lib⽂件夹下,对l的配置如下:
<dependencies>标签⾥⾯引⼊第三⽅jar包的依赖
pom.basedir指的是pom⽂件所在的⽬录,
systemPath指的是第三⽅jar包所在路径。
<dependency>
<groupId>com.abc</groupId>
<artifactId>cryptokit</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${pom.basedir}/lib/cryptokit-1.0.jar</systemPath>
</dependency>
还必须修改<plugins>标签⾥⾯的maven plugin,增加includeSystemScope属性并设置为true
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
第⼆种⽅式相⽐第⼀种⽅式,省事、⽅便。
2、将主程序打成jar包,然后和其他依赖jar包放在⼀起(包括maven下载的和第三⽅jar包),这样也可以通过java -jar xxx.jar⽅式运⾏
jar⽅式运⾏的前提是主程序jar包中的META-INF⽂件夹下的MANIFEST.MF⽂件必须有正确的Class-Path、Main-Class。
Class-Path指定了主程序依赖的jar包,若配置错误,运⾏jar时将报ClassNotFoundException;若新增或删除了⼀些jar包,需要删除该⽂件,并重新⽣成。
Main-Class指定了程序的运⾏⼊⼝,这⾥配置成SpringBoot的主函数。
MANIFEST.MF⽂件若配置不当,运⾏jar时将报xxxxxx.jar中没有主清单属性。
MANIFEST.MF⽰例如下:
Manifest-Version: 1.0
Class-Path: spring-expression-4.3.20.RELEASE.jar jboss-logging-3.3.2.F
inal.jar jcl-over-slf4j-1.7.25.jar SADK-CMBC-3.1.0.8.jar slf4j-api-1.
7.25.jar spring-boot-starter-web-1.5.17.RELEASE.jar spring-webmvc-4.3
.20.RELEASE.jar spring-boot-starter-tomcat-1.5.17.RELEASE.jar spring-
aop-4.3.20.RELEASE.jar spring-boot-1.5.17.RELEASE.jar spring-boot-sta
rter-logging-1.5.17.RELEASE.jar spring-core-4.3.20.RELEASE.jar snakey
aml-1.17.jar tomcat-embed-websocket-8.5.34.jar spring-beans-4.3.20.RE
LEASE.jar spring-boot-autoconfigure-1.5.17.RELEASE.jar log4j-over-slf
4j-1.7.25.jar hibernate-validator-5.3.6.Final.jar classmate-1.3.4.jar
spring-web-4.3.20.RELEASE.jar jul-to-slf4j-1.7.25.jar logback-classi
c-1.1.11.jar spring-context-4.3.20.RELEASE.jar spring-boot-starter-1.
5.17.RELEASE.jar jackson-databind-2.8.11.2.jar jackson-annotations-2.
8.0.jar tomcat-annotations-api-8.5.34.jar tomcat-embed-el-8.5.34.jar
jackson-core-2.8.11.jar logback-core-1.1.11.jar tomcat-embed-core-8.5
.34.jar validation-api-1.1.0.Final.jar
Main-Class: stmaven.TestmavenApplication
3、IDEA打包步骤
3.1打包多个jar包
按Ctrl+Alt+Shift+S打开项⽬配置,点击Atrifacts,然后按如下截图进⾏:
点击testmaven.jar,可以看到Main Class和Class Path都有内容了:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。