用蚂蚁创建捆绑包jar

问题描述:

我使用Ant来构建一些Java项目。
在某些情况下,我在JAR文件的表单中有一个包含外部依赖关系的lib/目录。用蚂蚁创建捆绑包jar

在构建,我创建了一个捆绑的罐子,包含项目的代码,依赖一起,加入到包JAR文件中的每个lib/目录罐子的zipfileset

问题是,每当我添加一个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> 

,这里是我如何建立我的类路径:

<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从张贴的包目标使用以上。 这部分我从其他地方复制过,所以我并不是那么熟悉它。

快速编辑。 Java3c需要了解这些罐子。

<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

下面是一个类似于jonescb的方法,它包含最终的'build.xml'(大图),这个答案中缺少这个方法:http://www.mkyong.com/ant/ant-create-a-fat-jar文件/ – Stephan

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

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

罐子文件是否可以嵌套?你确定这会起作用吗? – abyx

+0

嗯,我想不是,我在想战争和webapps而不是罐子,对不起'回合。 – Upgradingdave

使用zipgroupfileset。例如:

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

zipgroupfileset是记录与Zip任务。

+0

正如jonescb回答,那真的是解决方案。从来没有看到它,因为它隐藏在Zip任务 – abyx

+0

这个问题的最大问题是jar文件是否有额外的文件,通常在MANIFEST目录中。例如,许多spring框架jar包含spring.handlers,spring.schemas和spring.tooling文件..好吧,我还没有想过如何处理这些..合并? – ticktock

+1

@GeorgeBaxter一直在寻找相同的东西,并最终做[this](http://*.com/a/24083318/2208271)。让我知道你是否找到更好的解决方案。 – Sithsu

对于那些你使用NetBeans在这里的是如何创建与库JAR档案使用zipgroupfileset捆绑:

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