背景:
java -jar .\SpringBootDemo-1.0-SNAPSHOT.jar --spring.profiles.active=dev
在运行打包以后的maven项目时,出现了如下报错信息
解决办法:
1、需要在项目根目录下的pom.xml文件中添加SpringBoot 构建的插件
org.springframework.boot
spring-boot-maven-plugin
repackage
pom.xml文件内容如下:
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.zoneber
SpringBootDemo
1.0-SNAPSHOT
SpringBootDemo
http://www.example.com
UTF-8
1.7
1.7
org.springframework.boot
spring-boot-starter-parent
2.3.5.RELEASE
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
junit
junit
4.11
test
maven-clean-plugin
3.1.0
maven-resources-plugin
3.0.2
maven-compiler-plugin
3.8.0
maven-surefire-plugin
2.22.1
maven-jar-plugin
3.0.2
maven-install-plugin
2.5.2
maven-deploy-plugin
2.8.2
maven-site-plugin
3.7.1
maven-project-info-reports-plugin
3.0.0
org.springframework.boot
spring-boot-maven-plugin
repackage
注意:XML结构不能乱,否则无法正常打包
2、然后通过 mvn install 命令重新安装项目依赖
在运行mvn install的时候,自动生成这些主清单属性,运行java -jar xxx.jar时会根据主清单属性找到启动类,从而启动程序
3、再次通过mvn package 命令对maven项目进行打包
D:\IdeaProjects\SpringBootDemo>mvn package
[INFO] Scanning for projects...
[INFO]
[INFO] ---------------------< com.zoneber:SpringBootDemo >---------------------
[INFO] Building SpringBootDemo 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:3.0.2:resources (default-resources) @ SpringBootDemo ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 4 resources
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @ SpringBootDemo ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:3.0.2:testResources (default-testResources) @ SpringBootDemo ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory D:\IdeaProjects\SpringBootDemo\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.0:testCompile (default-testCompile) @ SpringBootDemo ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.22.1:test (default-test) @ SpringBootDemo ---
[INFO]
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO]
[INFO] --- maven-jar-plugin:3.0.2:jar (default-jar) @ SpringBootDemo ---
[INFO] Building jar: D:\IdeaProjects\SpringBootDemo\target\SpringBootDemo-1.0-SNAPSHOT.jar
[INFO]
[INFO] --- spring-boot-maven-plugin:2.3.5.RELEASE:repackage (repackage) @ SpringBootDemo ---
[INFO] Replacing main artifact with repackaged archive
[INFO]
[INFO] --- spring-boot-maven-plugin:2.3.5.RELEASE:repackage (default) @ SpringBootDemo ---
[INFO] Replacing main artifact with repackaged archive
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.820 s
[INFO] Finished at: 2022-05-27T16:52:50+08:00
[INFO] ------------------------------------------------------------------------
4、然后根据提示找到jar包存放的位置
对jar包进行解压, 以查看是否包含主清单属性需要的BOOT-INF,META-INF,org这三个文件夹
并且打开META-INF文件夹中的MANIFEST.MF文件查看程序的入口以及版本信息
Manifest-Version: 1.0
Implementation-Title: SpringBootDemo
Implementation-Version: 1.0-SNAPSHOT
Built-By: admin
Implementation-Vendor-Id: com.zoneber
Spring-Boot-Version: 2.3.5.RELEASE
Main-Class: org.springframework.boot.loader.JarLauncher
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Start-Class: com.zoneber.MyApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Created-By: Apache Maven 3.8.4
Build-Jdk: 1.8.0_40
Implementation-URL: http://www.example.com
- Main-Class 代表了Spring Boot中启动jar包的程序
- Start-Class 属性就代表了Spring Boot程序的入口类,这个类中应该有一个main方法
- Spring-Boot-Classes 代表了类的路径,所有编译后的class文件,以及配置文件,都存储在该路径下
- Spring-Boot-Lib 表示依赖的jar包存储的位置
这些值都是SpringBoot打包插件会默认生成的,如果没有这些属性,SpringBoot程序自然不能运行,就会报错:jar中没有主清单属性,也就是说没有按照SpringBoot的要求,生成这些必须的属性
5、然后通过java命令启动该项目,并激活开发环境(dev)的 Profile。
java -jar .\SpringBootDemo-1.0-SNAPSHOT.jar --spring.profile.active=dev
其中 --spring.profiles.active=dev 为激活开发环境(dev)Profile 的命令行参数
启动成功的效果图如下: