用ant创build一个bundle jar

我使用Ant来构build一些Java项目。
在一些,我有一个lib/目录,其中包含外部依赖,在JAR文件的forms。

在构build过程中,通过在bundle jar文件中为lib/目录中的每个jar添加一个zipfileset ,创build一个捆绑的jar,其中包含项目的代码以及依赖关系。

问题是,每次我添加一个jar或更改名称时,我都需要记住更新build.xml文件,因为我找不到以自动方式添加这些zipfilesets的方法,一定的模式(如lib/*.jar )。

有没有更好的方法来做到这一点?

我已经考虑编写我自己的Ant任务了,或者使用Groovy的ant API以编程的方式来完成这个工作,但是想知道是否有一种方法可以使用“vanilla”ant。

在我的目标中,我有这样的东西:

 <jar destfile="${store.dir}/temp_final.jar" filesetmanifest="skip"> <zipgroupfileset dir="dist" includes="*.jar"/> <zipgroupfileset dir="dist/lib" includes="*.jar" excludes=""/> <manifest> <attribute name="Main-Class" value="${main.class}"/> <attribute name="Class-Path" value="${mf.classpath}"/> </manifest> </jar> 

这里是我如何build立我的类path:

 <path id="build.classpath"> <fileset dir="${basedir}/"> <include name="${lib.dir}/*.jar"/> </fileset> </path> <pathconvert property="mf.classpath" pathsep=" "> <path refid="build.classpath"/> <mapper> <chainedmapper> <flattenmapper/> <globmapper from="*.jar" to="lib/*.jar"/> </chainedmapper> </mapper> </pathconvert> 

从上面发布的包目标中使用mf.classpath。 这部分我从其他地方复制,所以我不是那么熟悉它。

快速编辑。 Javac也需要了解这些jar子。

 <path id="jars"> <fileset dir="${lib.dir}" includes="**/*.jar"/> </path> <target name="compile"> <mkdir dir="${build.dir}"/> <javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="jars" debug="on"/> </target> 

使用zipgroupfileset 。 例如:

 <target name="jar"> <jar destfile="foo.jar" basedir="${dir.classes}"> <zipgroupfileset dir="lib" includes="*.jar"/> </jar> </target> 

zipgroupfileset文件zipgroupfileset是用Zip任务logging的。

对于那些使用NetBeans的用户,可以使用zipgroupfileset捆绑库来创buildJAR压缩文件:

 <target name="-post-jar"> <property name="store.jar.name" value="MyJarName"/> <property name="store.dir" value="dist"/> <property name="store.jar" value="${store.dir}/${store.jar.name}.jar"/> <echo message="Packaging ${application.title} into a single JAR at ${store.jar}"/> <jar destfile="${store.dir}/temp_final.jar" filesetmanifest="skip"> <zipgroupfileset dir="dist" includes="*.jar"/> <zipgroupfileset dir="dist/lib" includes="*.jar"/> <manifest> <attribute name="Main-Class" value="${main.class}"/> </manifest> </jar> <zip destfile="${store.jar}"> <zipfileset src="${store.dir}/temp_final.jar" excludes="META-INF/*.SF, META-INF/*.DSA, META-INF/*.RSA"/> </zip> <delete file="${store.dir}/temp_final.jar"/> <delete dir="${store.dir}/lib"/> <delete file="${store.dir}/README.TXT"/> </target> 

我已经将这个目标定义添加到了build.xml文件的末尾。 目标名称是-post-jar。

下面是一个简单的ant目标示例,它将创build一个包含lib目录下所有jar文件的jar(名为test.jar)。 也许这会解决你的问题?

 <target name="jar"> <jar destfile="test.jar"> <fileset dir="lib/" includes="**/*.jar" /> </jar> </target>