Ant脚本打包Jar:如何全局排除指定模式文件?
在Ant中实现Jar构建的全局文件排除
Ant的<jar>任务本身不支持直接对所有嵌套的<fileset>/<zipfileset>应用全局排除规则,但可以通过以下两种简洁的方式实现类似效果:
方法1:复用全局模式集合(Patternset)
先定义一个包含所有全局排除规则的<patternset>,然后在每个需要排除的fileset/zipfileset中引用这个集合,避免重复编写规则:
- 定义全局排除规则:
<!-- 全局排除规则集合 --> <patternset id="global.excludes"> <exclude name="com/**"/> <!-- 你的目标排除模式 --> <!-- 可添加更多全局排除规则,比如 <exclude name="test/**"/> --> </patternset>
- 在所有fileset/zipfileset中引用:
<jar destfile="output/myapp.jar"> <!-- 普通fileset引用全局排除 --> <fileset dir="bin/classes"> <patternset refid="global.excludes"/> <!-- 这里可以保留当前fileset的本地include/exclude规则 --> </fileset> <!-- zipfileset同样引用全局排除 --> <zipfileset src="lib/dependency.jar"> <patternset refid="global.excludes"/> </zipfileset> </jar>
方法2:自定义带全局排除的宏(Macrodef)
如果项目中有大量fileset需要修改,可以自定义一个封装了全局排除规则的宏,直接替换原有的<fileset>/<zipfileset>标签:
- 定义自定义fileset宏:
<macrodef name="global.fileset"> <attribute name="dir"/> <!-- 保留原fileset的dir属性 --> <element name="local-patterns" optional="true"/> <!-- 允许添加本地规则 --> <sequential> <fileset dir="@{dir}"> <patternset refid="global.excludes"/> <local-patterns/> <!-- 插入本地的include/exclude规则 --> </fileset> </sequential> </macrodef> <!-- 同理可定义global.zipfileset --> <macrodef name="global.zipfileset"> <attribute name="src"/> <element name="local-patterns" optional="true"/> <sequential> <zipfileset src="@{src}"> <patternset refid="global.excludes"/> <local-patterns/> </zipfileset> </sequential> </macrodef>
- 使用自定义宏替代原标签:
<jar destfile="output/myapp.jar"> <global.fileset dir="bin/classes"> <local-patterns> <include name="org/**"/> <!-- 本地包含规则 --> </local-patterns> </global.fileset> <global.zipfileset src="lib/dependency.jar"/> </jar>
为什么直接在标签加excludes无效?
<jar>任务的excludes属性仅对未显式指定fileset时的默认文件集生效。当你显式添加了<fileset>或<zipfileset>,这些子集合的过滤规则完全独立,<jar>的全局excludes不会作用于它们——这就是你之前尝试失效的原因。
内容的提问来源于stack exchange,提问作者Rupti
相关产品推荐
相关产品推荐

