Springboot 使用 maven-resources-plugin 打包变量替换jar没有打包进去、Jar包没有被使用

问题场景:

最近在使用环境分离,必须用到maven-resources-plugin来替换配置文件变量。遇到了一些问题。

  1. 程序写好了需要打包为packge.jar。
  2. 恰好本地使用了一些jar包(如:them.jar)作为依赖。
  3. 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. 复制代码
    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 包中使用。

相关推荐
MacroZheng17 分钟前
还在用WebSocket实现即时通讯?试试MQTT吧,真香!
java·spring boot·后端
midsummer_woo40 分钟前
基于springboot的IT技术交流和分享平台的设计与实现(源码+论文)
java·spring boot·后端
别惹CC2 小时前
Spring AI 进阶之路01:三步将 AI 整合进 Spring Boot
人工智能·spring boot·spring
柯南二号3 小时前
【Java后端】Spring Boot 集成 MyBatis-Plus 全攻略
java·spring boot·mybatis
javachen__4 小时前
SpringBoot整合P6Spy实现全链路SQL监控
spring boot·后端·sql
IT毕设实战小研11 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
一只爱撸猫的程序猿12 小时前
使用Spring AI配合MCP(Model Context Protocol)构建一个"智能代码审查助手"
spring boot·aigc·ai编程
甄超锋12 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat
武昌库里写JAVA14 小时前
JAVA面试汇总(四)JVM(一)
java·vue.js·spring boot·sql·学习
Pitayafruit15 小时前
Spring AI 进阶之路03:集成RAG构建高效知识库
spring boot·后端·llm