Eclipse 在ANT中重用zipfileset语句列表
我有一个build.xml,其中我将一些胖的可运行jar放在一起,目标类似于:Eclipse 在ANT中重用zipfileset语句列表,eclipse,ant,jar,build,Eclipse,Ant,Jar,Build,我有一个build.xml,其中我将一些胖的可运行jar放在一起,目标类似于: <target name="create_myapp_jar"> <jar destfile="./production/myapp.jar" filesetmanifest="mergewithoutmain"> <manifest> <attribute name="Main-Class" value="com.something.entrypoi
<target name="create_myapp_jar">
<jar destfile="./production/myapp.jar" filesetmanifest="mergewithoutmain">
<manifest>
<attribute name="Main-Class" value="com.something.entrypoints.MyApp"/>
<attribute name="Class-Path" value="."/>
</manifest>
<fileset dir="./classes"/>
<zipfileset excludes="META-INF/*.SF" src="./lib/commons-cli-1.2.jar"/>
<zipfileset excludes="META-INF/*.SF" src="./lib/commons-codec-1.10-sources.jar"/>
<zipfileset excludes="META-INF/*.SF" src="./lib/commons-codec-1.10.jar"/>
<zipfileset excludes="META-INF/*.SF" src="./lib/commons-io-2.4.jar"/>
<zipfileset excludes="META-INF/*.SF" src="./lib/commons-lang-2.6.jar"/>
<zipfileset excludes="META-INF/*.SF" src="./lib/commons-pool2-2.2.jar"/>
lots and lots of more JARs here....
</target>
这里有很多很多罐子。。。。
代码是由Eclipse(Export runnable Jar)生成的,我做了一些小改动
所包括的罐子的列表实际上相当长。我构建了几个这样的胖罐子,我想知道如何避免为每个目标列出
语句
我如何将它们组合在一起,然后从每个胖jar构建目标引用它们?所有这些都是为了不让build.xml膨胀到成百上千行。另外,如果我能在某个地方有一个定义,那么向每个目标添加一个新JAR的痛苦就会消失。a
zipgroupfileset
可以用来完成这一点:
<target name="create_myapp_jar">
<jar destfile="./production/myapp.jar" filesetmanifest="mergewithoutmain">
<manifest>
<attribute name="Main-Class" value="com.something.entrypoints.MyApp"/>
<attribute name="Class-Path" value="."/>
</manifest>
<fileset dir="./classes"/>
<zipgroupfileset dir="lib/" includes="*.jar" excludes="META-INF/*.SF" />
</jar>
</target>
. 这里有一个简单的解决方法。据我所知,每个构建的jar的zipfileset条目列表总是相同的?也许你应该考虑制作一个包含ZIPFILSEET条目的宏,并使用变量来调整每个目标上下文的宏:
<macrodef name="make-jar">
<attribute name="destfile"/>
<attribute name="mainclass"/>
<attribute name="classpath"/>
<attribute name="obj.dir"/>
<sequential>
<jar destfile="@{destfile}" filesetmanifest="mergewithoutmain">
<manifest>
<attribute name="Main-Class" value="@{mainclass}"/>
<attribute name="Class-Path" value="@{classpath}"/>
</manifest>
<fileset dir="@{obj.dir}"/>
<zipfileset excludes="META-INF/*.SF" src="./lib/commons-cli-1.2.jar"/>
<zipfileset excludes="META-INF/*.SF" src="./lib/commons-codec-1.10-sources.jar"/>
<zipfileset excludes="META-INF/*.SF" src="./lib/commons-codec-1.10.jar"/>
<zipfileset excludes="META-INF/*.SF" src="./lib/commons-io-2.4.jar"/>
<zipfileset excludes="META-INF/*.SF" src="./lib/commons-lang-2.6.jar"/>
<zipfileset excludes="META-INF/*.SF" src="./lib/commons-pool2-2.2.jar"/>
lots and lots of more JARs here....
</jar>
</sequential>
</macrodef>
<target name="create_myapp_jar">
<make-jar destfile="./production/myapp.jar" mainclass="com.something.entrypoints.MyApp" classpath="." obj.dir="./classes"/>
</target>
这里有很多很多罐子。。。。
谢谢!这就解决了我眼前的问题,但是这只适用于JAR位于同一目录中的情况(当然这是最常见的情况)。如果我想要它,我是否可以“分组”一个JAR列表,给它们一个名称,然后引用该名称?运行时,我得到了“线程中的异常”main“java.lang.SecurityException:清单主属性的签名文件摘要无效”,排除真的有效吗?@peternderson你说得对。对于zipgroupfileset
,此处的excludes
无法按预期工作。我更新了答案。这很好地工作了,我碰巧也有一个宏的东西。。。。可惜我不能把两个答案都标为“正确”。必须考虑哪一个是最好的。
<macrodef name="make-jar">
<attribute name="destfile"/>
<attribute name="mainclass"/>
<attribute name="classpath"/>
<attribute name="obj.dir"/>
<sequential>
<jar destfile="@{destfile}" filesetmanifest="mergewithoutmain">
<manifest>
<attribute name="Main-Class" value="@{mainclass}"/>
<attribute name="Class-Path" value="@{classpath}"/>
</manifest>
<fileset dir="@{obj.dir}"/>
<zipfileset excludes="META-INF/*.SF" src="./lib/commons-cli-1.2.jar"/>
<zipfileset excludes="META-INF/*.SF" src="./lib/commons-codec-1.10-sources.jar"/>
<zipfileset excludes="META-INF/*.SF" src="./lib/commons-codec-1.10.jar"/>
<zipfileset excludes="META-INF/*.SF" src="./lib/commons-io-2.4.jar"/>
<zipfileset excludes="META-INF/*.SF" src="./lib/commons-lang-2.6.jar"/>
<zipfileset excludes="META-INF/*.SF" src="./lib/commons-pool2-2.2.jar"/>
lots and lots of more JARs here....
</jar>
</sequential>
</macrodef>
<target name="create_myapp_jar">
<make-jar destfile="./production/myapp.jar" mainclass="com.something.entrypoints.MyApp" classpath="." obj.dir="./classes"/>
</target>