maven 中 filtering 的使用, 打包时排除资源目录, 以及 SpringBoot 下失效的一种情况处理

本贴最后更新于 1244 天前,其中的信息可能已经事过境迁

第一种用法

SpringEL 表达式取值一般是{var}")中

maven 的 pom.xml 文件中也有类似的取值表达式, 也是通过 ${var}的方式取值

然而: 它们并不是一个东西!

EL 表达式适用于配置文件及代码中的注解

maven 的占位符取值表达式默认仅仅适用于 pom.xml 文件中

我们的需求大多是想打通二者的交流,如何做?

此时 filtering 就派上用场了

maven 的占位符解析表达式的使用场合默认只在 pom 文件范围内活动

如果想扩大它的活动范围,就必须指定需要扩大到哪些文件,然后指定 filtering=true.然后 maven 的占位符解析表达式就可以用于它里面的表达式解析了.

<build> <resources> <resource> <directory>${project.basedir}/src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build>

如果你的项目继承了 spring-boot-starter-parent,filtering 大概率无效

filtering 无效的原因是,pom.xml 继承了 spring boot 的依赖

<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> </parent>

点开这个依赖的 pom.xml,我们发现,spring boot 把默认的占位符号 ${}改成了 @

那么如果想在 application.properties 中使用 maven 的占位符以获取 maven 的参数,此时就不能用 ${},因为可能会与 EL 表达式冲突。解决方法如下:

  1. 此时 parent 依赖将 maven 占位符表达式默认改为 @var@ 的形式. 所以只能用 @var@ 替代 ${var}
  2. 在 pom.xml 里面添加如下内容
<properties> <resource.delimiter>${}</resource.delimiter> </properties>
  1. application.properties 里面不用 ${},改成 @ 例如:
jdbc.driverClassName=@jdbc.driverClassName@ jdbc.url=@jdbc.url@ jdbc.username=@jdbc.username@ jdbc.password=@jdbc.password@

第二种用法

在 springboot 中整合了 Vue.js。

我把 Vue.js 的前端项目放在了 resources/webapp 目录下,当 Vue.js build 出结果到 resources/statics 下以后,这个 webapp 作为源码目录是不应该被打包到最后部署的 jar 包中的。于是想把这个 resource/webapp 目录给屏蔽掉。因为一直保持着最小改动的原则,这里的方法我也没有具体的测试,因为它不仅增加了一个打包插件,而且还对 springboot 自带的打包插件增加了设置。
文章开头提到的这种基于 resources 标签的方法非常符合我心中的方式,经过尝试,终于用这种方式成功的排除掉了 resources/webapp。

<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> <resources> <resource> <filtering>true</filtering> <directory>src/main/resources</directory> <excludes> <exclude>webapp/**</exclude> </excludes> </resource> </resources> </build>

首先一个不一样的地方就是,增加了一个 filtering 节点并且设置值为 true

然后在 excludes 中用/**匹配了 webapp 下面的所有内容

根据这种原则,我们在打包时只想包含指定的资源文件,可以用标签来实现。

<resources> <resource> <filtering>true</filtering> <directory>src/main/resources</directory> <includes> <include>webapp/**</include> </includes> </resource> </resources>

如此,只有 webapp 下面的资源文件才能被打包到目标 jar 包中。

这种方式来排除资源,即简洁,又能够很容易就明白其中的原因。

总结:

  1. Spring EL 表达式和 MAVEN 的占位符表达式长得一样,但两者默认进水不犯河水,不能再 Spring 的范围内取 maven 的参数
  2. filtering 的作用就是打通两者的连接, 让井水犯河水, 具体来说是让 Spring 的范围内能取到 maven 的参数
  3. filtering 的使用要配合 resource 一起使用: 前者开启打通连接,后者指定打通的范围.
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    943 引用 • 1460 回帖
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    186 引用 • 318 回帖 • 266 关注
3 操作
zhaozhizheng 在 2021-09-16 14:23:19 更新了该帖
zhaozhizheng 在 2021-09-16 11:50:31 更新了该帖
zhaozhizheng 在 2021-09-16 11:49:18 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
zhaozhizheng
没有人会关心你付出过多少努力,撑得累不累,摔得痛不痛,他们只会看你最后站在什么位置,然后羡慕或者鄙夷 北京

推荐标签 标签

  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    230 引用 • 1454 回帖
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 632 关注
  • 快应用

    快应用 是基于手机硬件平台的新型应用形态;标准是由主流手机厂商组成的快应用联盟联合制定;快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台;以平台化的生态模式对个人开发者和企业开发者全品类开放。

    15 引用 • 127 回帖
  • Ubuntu

    Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的 Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu 的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。

    127 引用 • 169 回帖
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    21 引用 • 37 回帖 • 558 关注
  • 996
    13 引用 • 200 回帖 • 9 关注
  • 国际化

    i18n(其来源是英文单词 internationalization 的首末字符 i 和 n,18 为中间的字符数)是“国际化”的简称。对程序来说,国际化是指在不修改代码的情况下,能根据不同语言及地区显示相应的界面。

    8 引用 • 26 回帖
  • 反馈

    Communication channel for makers and users.

    124 引用 • 917 回帖 • 260 关注
  • 工具

    子曰:“工欲善其事,必先利其器。”

    292 引用 • 738 回帖
  • 安装

    你若安好,便是晴天。

    132 引用 • 1184 回帖
  • Flutter

    Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作,它正在被越来越多的开发者和组织使用,并且 Flutter 是完全免费、开源的。

    39 引用 • 92 回帖 • 2 关注
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    334 引用 • 323 回帖
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 569 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 68 关注
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖 • 1 关注
  • 负能量

    上帝为你关上了一扇门,然后就去睡觉了....努力不一定能成功,但不努力一定很轻松 (° ー °〃)

    88 引用 • 1235 回帖 • 402 关注
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    34 引用 • 467 回帖 • 751 关注
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3455 回帖 • 179 关注
  • 自由行
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    493 引用 • 928 回帖
  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    86 引用 • 122 回帖 • 628 关注
  • 智能合约

    智能合约(Smart contract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于 1994 年由 Nick Szabo 首次提出。

    1 引用 • 11 回帖
  • WebComponents

    Web Components 是 W3C 定义的标准,它给了前端开发者扩展浏览器标签的能力,可以方便地定制可复用组件,更好的进行模块化开发,解放了前端开发者的生产力。

    1 引用 • 6 关注
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖 • 3 关注
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    36 引用 • 35 回帖 • 1 关注