最近公司有个项目需要移植到 SpringBoot 框架上, 项目里面又有许多第三方 jar 包, 在 Linux 服务器上最方便的就是用 jar 的方式来运行 SpringBoot 项目了, 因此我研究了 2 种打 jar 包的方式, 记录如下, 供大家参考:
1, 通过 maven 插件, 将所有依赖包都打包成一个 jar 包, 然后通过 java -jar xxx.jar 方式运行
由于项目中有些 jar 包是第三方的, maven 官方仓库没有, 需要使用 mvn install 命令打包到本地, 然后将其写入到 pom.xml 的依赖中, maven 仓库有的 jar 包则从 maven 官网找到对应版本的 depdency 写入 pom 文件里面, 这样 maven 打包就可以包含第三方 jar 包了, 否则 maven 只会打包 pom 文件里面的, 不会包括第三方 jar 包, 程序运行将报错.
例如: 将 alipay-sdk-abc.jar 打包到本地仓库
mvn 命令:
mvn install:install-file -Dfile=G:\thirdpartyjar\alipay-sdk-abc.jar -DgroupId=com.thirdparty -DartifactId=alipay-sdk-abc -Dversion=3.1.0.8 -Dpackaging=jar
pom.xml 配置:
- <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>
2, 将主程序打成 jar 包, 然后和其他依赖 jar 包放在一起 (包括 maven 下载的和第三方 jar 包), 这样也可以通过 java -jar xxx.jar 方式运行
jar 方式运行的前提是主程序 jar 包中的 META-INF 文件夹下的 MANIFEST.MF 文件必须有正确的 Class-Path,Main-Class.
Class-Path 指定了主程序依赖的 jar 包, 若配置错误, 运行 jar 时将报 ClassNotFoundException;
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: com.example.testmaven.TestmavenApplication
IDEA 打包 jar 流程:
按 Ctrl+Alt+Shift+S 打开项目配置, 点击 Atrifacts, 然后按如下截图进行:
点击 testmaven.jar, 可以看到 Main Class 和 Class Path 都有内容了:
src 下也生成了 META-INFO 文件夹和 MAINFEST.MF 文件:
生成 artifacts:
点击 Build 或者 Rebuild 后将在对应文件下生成 artifacts 文件, 里面有依赖的 jar 包和主程序包;
文件夹地址栏输入 cmd 来打开 cmd:
然后输入 java -jar testmaven.jar, 就能正确运行 Spring Boot 项目了:
来源: https://www.cnblogs.com/stm32stm32/p/9973325.html