优点:简单
缺点:把所有的libs都打包进去,整个jar包太大。上传到服务器非常慢。
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${springboot.version}</version>
<configuration>
<mainClass>${mainClass}</mainClass>
<layout>jar</layout>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
优点:
1.把libs和myApp.jar 分开了,部署的时候只部署myApp.jar即可
2.打包后的样式效果和eclipse的export导出可执行jar打出的文件名称和jar包是一样的
myApp.jar
myApp_lib
<build>
<finalName>${build.jar.name}</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<!--Filtering 是 maven 的 resource 插件 提供的功能,作用是用环境变量、pom文件里定义的属性和指定配置文件里的属性替换属性(*.properties)文件里的占位符(${jdbc.url}) -->
<filtering>true</filtering>
<includes>
<include>application.properties</include>
<!--
application-dev.properties 开发环境
application-prod.properties 运行环境
application-test.properties 测试环境
-->
<!--<include>application-${profileActive}.properties</include>-->
<include>*.properties</include>
<include>mapper/**/*.xml</include>
<include>static/**</include>
<include>templates/**</include>
<include>*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.yml</include>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
<!-- maven-dependency-plugin 复制项目的依赖包到指定目录 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>target/${build.jar.name}_lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
<includeScope>compile</includeScope>
</configuration>
</execution>
</executions>
</plugin>
<!-- maven-jar-plugin jar包的文件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<!-- 项目启动类 -->
<mainClass>ins.sinosoft.PreventionApplication</mainClass>
<!-- 依赖的jar的目录前缀,这个名称是为了和eclipse统一 -->
<classpathPrefix>${build.jar.name}_lib</classpathPrefix>
<addClasspath>true</addClasspath>
</manifest>
<!-- 增加当前目录,在META-INF/MANIFEST.MF中的Class-Path前面会多一个点.表示当前目录
比如:Class-Path: . prevention_lib/spring-boot-starter-2.0.4.RELEASE.jar
增加这个是为了解决以下这种配置方式,jar包外的application.properties无效的问题。
-config/application.properties
-myApplication.jar
-->
<manifestEntries>
<Class-Path>.</Class-Path>
</manifestEntries>
</archive>
</configuration>
</plugin>
</plugins>
</build>
<!--MAVEN打包选择运行环境 : 目前没有使用到,可以删除-->
<!-- 1:dev:开发环境 2:test 测试环境 3:uat 用户验收测试 4.pro:生产环境-->
<profiles>
<profile>
<id>dev</id>
<properties>
<profileActive>dev</profileActive>
</properties>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
</profile>
<profile>
<id>test</id>
<properties>
<profileActive>test</profileActive>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<!-- 生产环境配置不打包 -->
<!--<profile>
<id>prod</id>
<properties>
<profileActive>prod</profileActive>
</properties>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
</profile>-->
</profiles>
注意:
1. profiles可以去掉,并不依赖profiles打包。这里并没有使用profiles。
生产的最终目录是这样的:
-config/application.properties
-myApplication.jar
也就是说与环境相关的配置文件都先放在服务器的config目下(与环境无关的公共配置仍然在jar中),而不需要根据profile依赖打包来上传。
因为配置是不会经常变的,所以没必要每次打包时还要考虑环境。
2.maven-jar-plugin 插件打包后,其实是不能识别myApplication.jar外的config/application.properties
解决方法一:启动时通过spring.config.additional-location指定,优先级最高。
java -jar myproject.jar --spring.config.additional-location=classpath:/default.properties,classpath:/override.properties
解决方法二:maven-jar-plugin 增加配置
<!-- 增加当前目录,在META-INF/MANIFEST.MF中的Class-Path前面会多一个点.表示当前目录
比如:Class-Path: . prevention_lib/spring-boot-starter-2.0.4.RELEASE.jar
增加这个是为了解决以下这种配置方式,jar包外的config/application.properties无效的问题 -->
<manifestEntries>
<Class-Path>.</Class-Path>
</manifestEntries>
3.Spring Boot加载配置文件顺序?
https://docs.spring.io/spring-boot/docs/2.0.4.RELEASE/reference/html/boot-features-external-config.html#boot-features-external-config-profile-specific-properties
SpringBoot配置文件加载优先级(数字小的优先:springBoot的处理是已存在就不加载):
~/.spring-boot-devtools.properties
when devtools is active).@TestPropertySource
annotations on your tests.@SpringBootTest#properties
annotation attribute on your tests.SPRING_APPLICATION_JSON
(inline JSON embedded in an environment variable or system property).ServletConfig
init parameters.ServletContext
init parameters.java:comp/env
.System.getProperties()
).RandomValuePropertySource
that has properties only in random.*
.application-{profile}.properties
and YAML variants).application-{profile}.properties
and YAML variants).application.properties
and YAML variants).application.properties
and YAML variants).@PropertySource
annotations on your @Configuration
classes.SpringApplication.setDefaultProperties
).搜索配置文件时的顺序:
file:./custom-config/ 表示java启动时spring.config.additional-location指定才存在
classpath:custom-config/ 表示java启动时spring.config.additional-location指定才存在
file:./config/
file:./
classpath:/config/
classpath:/
原文:https://www.cnblogs.com/caoshouling/p/14010657.html