maven多环境打包实现web.xml和context.xml中的占位符变量替换

2023-11-03

       在springboot或传统springmvc的tomcat项目中,为了实现spring容器文件中的变量替换,我们通常可以在项目的resource目录下新建几个环境目录,例如rd、test、dev、stress、online等等,然后再在对应的环境目录下放一些数据库的配置文件(例如jdbc.properties)、redis的配置文件(例如redis.properties)等等,当然你也可以直接使用一个config.properties(里面包含了数据库和redis以及其他的变量定义)。这样做了以后,在pom.xml中的profile标签中,把你上述定义的几个环境目录也在profile标签中定义出来,并选择其中一个作为默认激活选项。当使用maven打包并使用-P命令指定环境时,就会打包对应环境下的配置,并自动进行变量替换。

      以上是常规做法,但是当你在webapp/WEB-INF/web.xml和webapp/META-INF/context.xml这两个文件中也那么做的时候,发现最后打包完占位符依然是占位符,并没有自动替换,这是为什么呢?

      要实现webapp/WEB-INF/web.xml和webapp/META-INF/context.xml这两个文件中的占位符(或EL表达式)自动变量替换,就要借助maven的一个插件-----maven-war-plugin,有了这个插件,web项目文件的任何变量几乎都可以替换。

      一、下面先从webapp/WEB-INF/web.xml如何实现变量替换说起:

      ①因为我的项目使用了单点登录,那么就要在web.xml中配置casServer、casServerUrlPrefix、serverName这几个参数。之前在web.xml中的filter中写的是具体值,导致每个环境都要改一遍,现在我把他们用占位符代替,如下所示:

②然后在pom.xml中的profile中定义这几个参数的具体值,并且每个环境的具体值和每个环境的profile定义在一起,这里以test环境为例,其他环境profile形式相同(值不同),如下所示:

  ③最后是maven-war-plugin的配置,如下:

    ④最后用maven编译,发现变量全部替换成功,不过这里有一点需要注意的地方就是maven-war-plugin插件对字符编码的支持不太好,如果你的web.xml文件中包含中文字符(包括变量值和中文注释),那么maven编译完就会中文乱码,导致服务无法启动,报如下错误:

    这个解决方法就是:一是去掉web.xml中的中文字符;二是将web.xml中的第一行scheme头中的字符编码声明为GBK,如下:

 

     二、下面我们来看下webapp/META-INF/context.xml如何实现变量替换

     ①我的项目中使用了基于tomcat的JNDI数据源,你可以在tomcat的conf目录下的server.xml中新建一个resource标签配置jdbc连接,也可以在 项目webapp/META-INF/目录下的context.xml中定义resource标签来配置jdbc连接,当这两个地方同时配置时,webapp/META-INF/context.xml会覆盖tomcat的conf目录下的server.xml中的配置。所以如果想在webapp/META-INF/context.xml中实现变量替换,先将context.xml中的jdbc连接地址、用户名、密码用占位符代替,然后有两种方式实现maven打包自动替换,都要借助maven-war-plugin插件:

     第一种方式就是上面的web.xml方式,先在pom.xml中的对应环境的profile标签中定义jdbc的连接地址、用户名和密码的具体值,然后在maven-war-plugin中指定资源目录和要过滤的文件以及打包的目标目录。这里我们来着重介绍

     第二种方法:

      ②在resource目录下的rd、test、dev等目录下分别建一个context.xml文件,文件里面分别是各自环境对应的jndi配置。我们的目的是在maven编译完打包后实现webapp/META-INF/目录下context.xml文件的替换。

      ③接下来配置maven-war-plugin打包方式,如下:

    ④maven编译打包完,发现成功替换;从这个方法来看,其实上面的web.xml也可以采用这种方式,在rd、test等目录下分别建一个web.xml,每个文件中分别是各自环境中的casServer地址等等,然后配置maven-war-plugin打包方式。不过这种方式的缺点就是新建的文件太多了,显得臃肿

     参考地址:https://q.cnblogs.com/q/71336/

http://maven.40175.n5.nabble.com/How-to-filter-META-INF-context-xml-td120983.html

https://blog.csdn.net/xlxxcc/article/details/51979824

https://blog.csdn.net/qq_35028064/article/details/83657363?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-9

https://blog.csdn.net/weixin_33953384/article/details/92308649?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-1

http://maven.apache.org/plugins/maven-war-plugin/examples/adding-filtering-webresources.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

maven多环境打包实现web.xml和context.xml中的占位符变量替换 的相关文章

随机推荐

  • 2.2.2 处理器(CPU)资源

    最后更新2021 07 08 处理器资源有两类 物理CPU和虚拟CPU 由于在虚拟化不同层面有不同的解释 因此请先确认其含义 后续如无特别说明 与x86系列对应 CPU即通常说的CPU core CPU封装即socket 通常IBM Pow
  • 接口文档,开放

    网易 http c m 163 com nc article headline T1348647853363 0 40 html 头条 http c 3g 163 com nc article list T1467284926140 0 2
  • DevOps 面试题集锦

    注 本文译自 https www javatpoint com devops interview questions 下面列出了常见的DevOps面试问题和答案 1 请解释 DevOps DevOp 是两个词的组合 一个是软件 Develo
  • MIPI DSI 接口驱动 FPGA 模块

    MIPI DSI 接口驱动 FPGA 模块 在当前智能设备的快速发展和功能多样化的背景下 处理高清视频流和图形数据的需求越来越高 MIPI DSI Mobile Industry Processor Interface Display Se
  • 竞赛 基于大数据的时间序列股价预测分析与可视化 - lstm

    文章目录 1 前言 2 时间序列的由来 2 1 四种模型的名称 3 数据预览 4 理论公式 4 1 协方差 4 2 相关系数 4 3 scikit learn计算相关性 5 金融数据的时序分析 5 1 数据概况 5 2 序列变化情况计算 最
  • adb 安装apk到指定设备

    一 打印设备代号 adb devices 红色和绿色区域为设备代号 二 命令 adb s 4580fa7e User aaa apk 加上 s 设备代号 apk路径替换成自己的 三 安装成功 Performing Streamed Inst
  • qrcode.js 解析二维码(源码) 复制的

    qrcode js 解析二维码 源码 复制的 var aa aa ab function f e var d qrcode width var b qrcode height var c true for var g 0 g lt e le
  • 猿人学第二题

    通过fd抓包发现他是进行了两次请求 先返回的是一对script的标签定义的js代码 第二次返回的才是正常的html代码 打开f12进入浏览器控制台 发现进入了无限debuger 那么直接在控制台中输入Function prototype c
  • 【华为OD机试真题2023B卷 JAVA&JS】观看文艺汇演问题

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 观看文艺汇演问题 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 为庆祝中国共产党成立100周年 某公园将举行多场文艺汇演 很多演出都是同时进行 一个人只能同时观看一场
  • 同时安装多台服务器系统,多服务器同时安装操作系统

    多服务器同时安装操作系统 内容精选 换一换 如果您需要使用毕昇编译器 则需要先在服务端安装毕昇编译器 毕昇编译器基于开源LLVM开发 并进行了优化和改进 同时将flang作为默认的Fortran语言前端编译器 是针对鲲鹏平台的高性能编译器
  • python2 tensorflow_谷歌TensorFlow 2.1.0正式发布 支持Python 2的最后一个 TF 版本

    TensorFlow 2 1 0 正式发布了 TensorFlow 2 1 是支持 Python 2 的最后一个 TF 版本 主要特性和改进如下 tensorflow pip 软件包现在默认包括针对 Linux 和 Windows 的 GP
  • vue组件通信总结(转)

    虽然一直使用 vue 文章中的方法也一直使用 但是 这么齐全的总结 却没有过 写的不错 链接
  • HTML lang 没你想的那么简单

    前言 做 web 无障碍相关的研究时 遇到的第一件事就是要给 设置正确的 lang 属性 这么简单的一件事 想也不用就写好了 或者直接简写成 Bingo 可以去做其它事了 但仔细想一想 好像有些问题 zh 是什么鬼 拼音 明明是国际标准怎么
  • SpringBoot 添加 MDC 日志链路追踪

    文章目录 1 线程池配置 2 拦截器配置 3 日志文件配置 4 异步方法使用 5 定时任务使用 日志链路追踪的意思就是将一个标志跨线程进行传递 在一般的小项目中也就是在你新起一个线程的时候 或者使用线程池执行任务的时候会用到 比如追踪一个用
  • shell脚本编程大全

    文章目录 一 命令行 二 shell 三 文件系统 四 shell命令 五 shell的父子关系 六 内建命令 七 环境变量 八 文件系统权限 九 管理文件系统 十 构建基本shell脚本 十一 使用结构化命令 十二 处理用户输入 十三 呈
  • “赶快上车,会调用你也可以当鉴黄师了”说罢,老司机转眼间将车门焊得死死的!

    都是学习用途 不知道为啥 图片被ban了 如需查看完整图片请转移到从今天开始种树 起因 本人在某平台发布文章时封面用了几张美女图片 内容里都是正常的流程图之类的 却被这个平台告知如下内容 大家评评理这图片违规么 查看完整图片请转移到从今天开
  • 上机作业:日历(java)

    上机作业 日历 java 1 思路框架分析 本着按照手机日历的构造模型作为model 我着手开始了日历java小程序的编写 说到日历 就不得不提一嘴最可恶的闰年 懂得都懂 闰年是bug制造者 这次用java语言编写 我特意拿出一个方法来判断
  • 543.二叉树的直径

    543 二叉树的直径 给定一棵二叉树 你需要计算它的直径长度 一棵二叉树的直径长度是任意两个结点路径长度中的最大值 这条路径可能穿过也可能不穿过根结点 本题需要明确二叉树的直径计算方法 二叉树的直径不一定过根节点 需要遍历左子节点和右子节点
  • 清除pip安装库时的缓存

    目录 1 命令清除缓存 2 路径手动清除 在使用pip安装Python库时 如果之前已经下载过该库 pip会默认使用缓存来安装库 而不是重新从网络上下载 缓存文件通常存储在用户目录下的缓存文件夹中 具体位置因操作系统和Python版本而异
  • maven多环境打包实现web.xml和context.xml中的占位符变量替换

    在springboot或传统springmvc的tomcat项目中 为了实现spring容器文件中的变量替换 我们通常可以在项目的resource目录下新建几个环境目录 例如rd test dev stress online等等 然后再在对