用ant创建一个bundle jar

时间:2009-11-30 19:16:55

标签: java ant jar

我正在使用Ant来构建一些Java项目 在某些情况下,我在JAR文件的表单中有一个lib/目录,其中包含外部依赖项。

在构建期间,我创建了一个捆绑的jar,它包含项目的代码以及依赖项,方法是在{jar}文件中为zipfileset目录中的每个jar添加lib/

问题是,每次添加jar或更改名称时,我都需要记住更新build.xml文件,因为我找不到添加zipfilesets的方法一种自动方式,包括特定模式的所有罐子(例如lib/*.jar)。

有没有更好的方法呢?

我考虑为此编写自己的Ant任务,或者使用Groovy的ant API以编程方式执行此操作,但是想知道是否有办法使用“vanilla”ant执行此操作。

4 个答案:

答案 0 :(得分:53)

在我的目标中,我有类似的东西:

<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>

以下是我构建类路径的方法:

<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也需要了解这些罐子。

<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>

答案 1 :(得分:29)

使用zipgroupfileset。例如:

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

zipgroupfileset记录了Zip任务。

答案 2 :(得分:7)

对于那些使用NetBeans的人来说,如何使用zipgroupfileset捆绑的库创建JAR存档:

<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。

答案 3 :(得分:1)

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

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