问题场景:
最近在使用环境分离,必须用到maven-resources-plugin来替换配置文件变量。遇到了一些问题。
- 程序写好了需要打包为packge.jar。
- 恰好本地使用了一些jar包(如:them.jar)作为依赖。
- jar包路径就在项目根目录的 lib 文件夹
问题1:本地依赖的jar包无法打包到程序包中
打完的包本地跑没有任何问题,发布到线上就找不到jar包报错:找不到 them.jar。为了找到问题测试了一下打包出 packge.jar 以后,将 lib 文件夹改为 lib1 运行 packge.jar 就报错找不到 them.jar ,看起来是没有打包进去。
问题1解决:
最终发现是没有打包进去,修改配置打包进去:
1、增加 project.repositories.dependency.scope 值为 system。
2、增加 project.build.plugins.plugin.configuration.includeSystemScope 值为 true。
<?xml version="1.0" encoding="UTF-8"?>
<project>
<repositories>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.31</version>
<!-- !!!注意这里,加上即可!!! -->
<scope>system</scope>
<!-- !!!注意这里,加上即可!!! -->
<systemPath>${project.basedir}/lib/them.jar</systemPath>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}-${project.version}-${spring.profiles.active}</finalName>
<plugins>
<!-- 外部 lib 导入到 jar 包中 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.4.2.RELEASE</version>
<configuration>
<fork>true</fork>
<!-- !!!注意这里,加上即可!!! -->
<includeSystemScope>true</includeSystemScope>
<!-- !!!注意这里,加上即可!!! -->
<mainClass>com.test.TestApplication</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>
问题2:发现 packge.jar 解压 them.jar 在其中,但是还是不生效。
说明还是引用的项目根目录 /lib 里的 jar 包。
解决问题2:
配置问题,这里使用了 maven-resources-plugin ,就要使用其内部的 resource 不能使用 build.resource 标签了。
<?xml version="1.0" encoding="UTF-8"?>
<project>
<repositories>
...
</dependencies>
<build>
<finalName>${project.artifactId}-${project.version}-${spring.profiles.active}</finalName>
<!-- 替换变量用 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<executions>
<execution>
<id>default-resources</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>target/classes</outputDirectory>
<useDefaultDelimiters>false</useDefaultDelimiters>
<delimiters>
<delimiter>@</delimiter>
</delimiters>
<!-- !!! 使用这里面的 resources !!! -->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/webapp</directory>
<targetPath>META-INF/resources</targetPath>
<includes>
<include>**/**</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<!-- !!! 使用这里面的 resources !!! -->
</configuration>
</execution>
</executions>
</plugin>
<!-- !!! 外部 resources 弃用!!! -->
<!-- <resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>-->
<!-- !!! 外部 resources 弃用!!! -->
</build>
</project>
问题3:发现插件maven-resources-plugin只在maven打包的时候生效
发现插件maven-resources-plugin只在maven打包的时候生效,只有使用maven命令生效,具体表现为:我们使用 idea 的 run 命令执行 maven-resources-plugin 下 resource 规则不生效资源没有进去,这就导致了使用 Rebel 热部署无法使用。
解决问题3:
使用 maven-resources-plugin只在maven打包的时候生,那就只能不用这个插件了。我的诉求就是只为了环境分离。
pom.xml改为:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
...
<properties>
<java.version>8</java.version>
<!-- !!!1、此处修改默认替换符!!!-->
<resource.delimiter>${}</resource.delimiter>
</properties>
<dependencies>
...
</dependencies>
<profiles>
<!-- !!!2、保留全部环境配置 !!!-->
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<spring.profiles.active>dev</spring.profiles.active>
</properties>
</profile>
... other profile
</profile>
</profiles>
<build>
<finalName>${project.artifactId}-${project.version}-${spring.profiles.active}</finalName>
<plugins>
<!-- 外部 lib 导入到 jar 包中 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.4.2.RELEASE</version>
<configuration>
<fork>true</fork>
<includeSystemScope>true</includeSystemScope>
<mainClass>com.wpj.simple.SimpleApplication</mainClass>
</configuration>
</plugin>
<!-- 打包结果输出用 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>print-custom-info</id>
<phase>package</phase>
<configuration>
<tasks>
<echo message="${spring.profiles.active} 环境打包执行成功"/>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/webapp</directory>
<targetPath>META-INF/resources</targetPath>
<includes>
<include>**/**</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/**</include>
</includes>
<excludes>
<exclude>jrebel.xml</exclude>
</excludes>
</resource>
<!-- !!!4、环境替换再切换为 build.resources.resource !!!-->
<resource>
<directory>src/main/resources</directory>
<!-- !!!5、开启替换 !!!-->
<filtering>true</filtering>
<includes>
<include>application.yml</include>
</includes>
</resource>
</resources>
</build>
</project>
-
1、project.properties.resource.delimiter 修改默认替换符。 2、project.build.plugins.maven-resources-plugin 依赖删除。 3、project.build.plugins.maven-resources-plugin.resources 移动到 project.build.plugins 下。
application.yml 改为:
spring:
profiles:
active: ${spring.profiles.active}
这样,project.profiles.profile.properties.spring.profiles.active 会替换成功,且热部署也可用、外部依赖依旧可以靠 spring-boot-maven-plugin 插件导入 jar 包中使用。