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

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

第一种用法

SpringEL 表达式取值一般是{var}方式取值, 见于application.properties和@Value("{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 回帖 • 265 关注
3 操作
zhaozhizheng 在 2021-09-16 14:23:19 更新了该帖
zhaozhizheng 在 2021-09-16 11:50:31 更新了该帖
zhaozhizheng 在 2021-09-16 11:49:18 更新了该帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 311 关注
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 211 关注
  • PostgreSQL

    PostgreSQL 是一款功能强大的企业级数据库系统,在 BSD 开源许可证下发布。

    22 引用 • 22 回帖 • 3 关注
  • uTools

    uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。

    6 引用 • 14 回帖
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    410 引用 • 3578 回帖 • 1 关注
  • WordPress

    WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。

    66 引用 • 114 回帖 • 209 关注
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 38 关注
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    12 引用 • 54 回帖 • 166 关注
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    210 引用 • 2036 回帖
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    92 引用 • 752 回帖
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 438 关注
  • 博客

    记录并分享人生的经历。

    273 引用 • 2388 回帖 • 1 关注
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖 • 8 关注
  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    17 引用 • 236 回帖 • 298 关注
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 598 关注
  • 分享

    有什么新发现就分享给大家吧!

    247 引用 • 1793 回帖
  • GAE

    Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

    14 引用 • 42 回帖 • 793 关注
  • Follow
    4 引用 • 12 回帖
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    315 引用 • 547 回帖 • 2 关注
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 544 关注
  • Flutter

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

    39 引用 • 92 回帖 • 1 关注
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 303 关注
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    93 引用 • 901 回帖 • 2 关注
  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    178 引用 • 816 回帖 • 2 关注
  • OneNote
    1 引用 • 3 回帖 • 2 关注
  • Chrome

    Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。

    62 引用 • 289 回帖 • 1 关注