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 包中使用。


http://www.ppmy.cn/news/1513821.html

相关文章

【深度学习】基于Transformers的大模型推理框架

本文旨在介绍基于transformers的decoder-only语言模型的推理框架。与开源推理框架不同的是&#xff1a; 本框架没有利用额外的开源推理仓库&#xff0c;仅基于huggingface&#xff0c;transformers&#xff0c;pytorch等原生工具进行推理&#xff0c;适合新手学习大模型推理流…

聚鼎科技:怎么做装饰画更受大众好评

在当今这个充满创意与个性表达的时代&#xff0c;装饰画不再仅仅是墙面的点缀&#xff0c;它成为了展现屋主品味与生活态度的重要载体。那么&#xff0c;究竟如何才能创作出既符合大众审美又具有独特魅力的装饰画呢? 融合流行元素与个性化设计是关键所在。一方面&#xff0c;通…

振兴杯全国青年职业技能大赛职业技能标准——物联网安装调试员

一、大赛概述 1.1 振兴杯全国青年职业技能大赛简介 振兴杯全国青年职业技能大赛是一项国家级的职业技能竞赛&#xff0c;自2005年首届大赛成功举办以来&#xff0c;已逐渐成为国内规模最大、影响力最广的青年职业技能竞赛之一。这项竞赛旨在推动青年技能人才的培养和发展&…

camx chi 开 log

下面这里是chi log: <settingsSubGroup Name"ChiOverride Settings"> <setting> <Name>Set Log levels</Name> <Help> Bitmask of log levels, bit 0 - error, …

Java面试-基础

1. 面向对象 什么是面向对象 什么是面向对象&#xff1f; 对比面向过程&#xff0c;是两种不同的处理问题的角度 面向过程更注重事情的每一个步骤及顺序&#xff0c;面向对象更注重事情有哪些参与者 &#xff08;对象&#xff09;、及各自需要做什么 封装、继承、多态 2. …

MySQL 数据库管理

在 MySQL 中&#xff0c;数据库管理是非常基础但又至关重要的技能。无论是创建新的数据库、选择当前使用的数据库&#xff0c;还是查看数据库的相关信息&#xff0c;这些操作都是日常数据库管理中不可或缺的一部分。本文将详细介绍 MySQL 数据库管理的基本操作&#xff0c;包括…

【Solidity】代币

ERC20 ERC-20 全称 “Ethereum Request for Comment 20”&#xff0c;是一种标准接口&#xff0c;用于实现代币合约。ERC20 标准定义了一组函数和事件&#xff0c;使得代币可以在不同的应用和平台之间互操作。 ERC20 标准接口定义了一组必须实现的函数和事件&#xff1a; in…

C#收集海康系读码器内容并硬触发IO报警

最近有个需求&#xff0c;需要对几台打码机读码器进行集中防重。 实现目标&#xff1a;1.对条码进行分机台收集追溯 2.发现重复进行触发IO报警 首先使用海康MVS软件对读码器进行设置&#xff0c;通讯设置为TCP服务器&#xff0c;我们软件做客户端 进行数据收集。 然后再收集到…

使用VMware安装银河麒麟桌面操作系统

安装银河麒麟桌面操作系统&#xff08;Kylin Desktop OS&#xff09;在 VMware 虚拟机上是一项相对简单的任务。以下是具体步骤&#xff1a; 1. 准备工作 VMware Workstation 或 VMware Player&#xff1a;确保已在您的计算机上安装了 VMware 。银河麒麟桌面操作系统的ISO镜像…

《Redis核心技术与实战》学习笔记6——数据同步:主从库如何实现数据一致?

文章目录 主从库间如何进行第一次同步&#xff1f;主从级联模式分担全量复制时的主库压力主从库间网络断了怎么办&#xff1f;小结 大家好&#xff0c;我是大白。 如果 Redis 发生了宕机&#xff0c;我们可以使用了 AOF 和 RDB分别通过回放日志和重新读入 RDB 文件的方式恢复数…

API接口安全101:基础概念与最佳实践

文章目录 API定义协议架构风格描述语言 Webservicewsdl介绍复现 SOAPswagger介绍指纹查找利用存在目录复现 HTTPWebpack介绍复现 在当今数字化时代,API接口已成为现代软件架构中不可或缺的组成部分。它们连接着各种应用程序和服务,促进了数据交换和功能集成。然而,随着API的普及…

python创建项目环境及项目打包

目录 创建项目环境conda创建环境常用命令创建项目虚拟环境创建虚拟环境激活虚拟环境安装第三方库 pyinstaller 打包常用参数组合 嵌入式打包下载嵌入式版本的python配置环境无参调用可完善 nuitka打包 创建项目环境 conda创建环境常用命令 conda create -n py310 python3.10.…

Vue 计算属性:优雅地处理数据逻辑

在 Vue.js 中&#xff0c;计算属性&#xff08;Computed Properties&#xff09;是一种非常实用的功能&#xff0c;它允许我们根据组件的响应式依赖进行缓存和派生状态。计算属性可以让我们以声明式的方式编写复杂的逻辑&#xff0c;而不必担心性能问题。 什么是计算属性&…

畅阅读小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;分类管理&#xff0c;充值信息管理&#xff0c;扣费信息管理&#xff0c;书城管理&#xff0c;购买章节管理&#xff0c;章节信息管理&#xff0c;书架管理&#xff0c;系统管理 …

机器学习——XGBoost

目录 一、初识XGBoost 1. 介绍 2. 使用 XGBoost 的方法 &#xff08;1&#xff09;直接使用xgboost库自己的建模流程 &#xff08;2&#xff09;使用xgboost库中的sklearn的API 3. XGBoost的三大板块 4. 提升集成算法 5. 建模流程 二、模型常用参数 1. n_estimators …

C++:模板 II(非类型模板参数,特化,分离编译)

目录 非类型模板参数 模板的特化 函数模板特化 类模板特化 全特化 偏特化 引用特化 指针特化 模板分离编译 非类型模板参数 什么是非类型模板参数&#xff1f; 顾名思义&#xff0c;它的类型形参并不是一个类型&#xff0c;就是用一个常量来作为类模板或函数模板的…

等保测评避坑指南(新手必看)

等保测评&#xff0c;即信息安全等级保护测评&#xff0c;是中国网络安全法规中的一项重要内容。它要求网络运营者根据信息系统的安全保护等级&#xff0c;采取相应的管理措施和技术措施&#xff0c;以确保信息系统安全。对于初次接触等保测评的企业或个人来说&#xff0c;了解…

【HTML】用盒子模型划分网页模块

1、盒子模型 ☞ 所谓的盒子模型在HTML中就是一个盛装 元素内容的容器。 ☞ 每个盒子模型都由元素的内容、宽高、 内边距&#xff08;padding&#xff09;、边框&#xff08;border&#xff09;和外边距 &#xff08;margin&#xff09;组成。 2、< div>标签 3、border…

[数据集][目标检测]街灯路灯检测数据集VOC+YOLO格式1893张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1893 标注数量(xml文件个数)&#xff1a;1893 标注数量(txt文件个数)&#xff1a;1893 标注…

Tomcat目录详解

版本&#xff1a;Tomcat&#xff08;7.0.100&#xff09;&#xff08;linux版&#xff09; &#xff08;官网&#xff1a;Apache Tomcat - Welcome!&#xff09; 1.Tomcat是什么。 Tomcat是一个免费的开放源代码的Web 应用服务器&#xff0c;属于轻量级应用服务器。是Apache…