如何在我的Ant构建中包含外部jar库

时间:2013-10-28 18:29:39

标签: java ant build

我有以下build.xml

<project>

<target name="clean">
    <delete dir="./build"/>
</target>

<target name="compile">
    <mkdir dir="./build/classes"/>          
    <javac srcdir="./src" destdir="./build/classes"/>                   
</target>

<target name="jar">
    <mkdir dir="./build/jar"/>
    <jar destfile="./build/jar/DependencyFinder.jar" basedir="./build/classes">
        <manifest>
            <attribute name="DependencyFinder" value="main"/>
        </manifest>
    </jar>
</target>

<target name="run">
    <java jar="./build/jar/DependencyFinder.jar" classname="${main-class}" fork="true"/>                    
</target>

</project>

这是我的目录结构:

/构建 / lib目录 / MagicFolder / src目录 /build.xml

文件夹src包含.java个文件。

MagicFolder的路径应该是输入参数。

lib有外部.jar库,应该包含在我的构建中。

build文件夹,它将编译.jar and .class`文件

问题: 我该如何更改build.xml?我的build.xml应该:

  1. 添加外部库./lib/jbl.jar
  2. 当我运行我的应用程序时,为我的应用程序输入2个输入参数

3 个答案:

答案 0 :(得分:34)

如果你需要在classpath中添加一个jar来编译代码(抱歉,你要求的内容还不是很清楚),那么你需要将<javac>任务更改为:< / p>

<javac srcdir="./src" destdir="./build/classes">   
    <classpath>
        <pathelement path="lib/jbl.jar"/>
    </classpath>
</javac>

或者,如果您需要将jbl.jar的内容添加到正在创建的jar中,则需要将<jar>任务更改为:

<jar destfile="./build/jar/DependencyFinder.jar" basedir="./build/classes>
    <zipgroupfileset dir="lib" includes="jbl.jar" />
    <manifest>
        <attribute name="DependencyFinder" value="main"/>
        <attribute name="Main-Class" value="org.ivanovpavel.YourMainClass"/>
    </manifest>
</jar>

要为<java>调用添加参数,请使用嵌套的<arg>元素:

<target name="run">
    <java jar="./build/jar/DependencyFinder.jar:lib/jbl.jar" classname="dependencyfinder.DependencyFinder">  
        <arg value="Alexander Rosenbaum"/>
        <arg value="Dmitry Malikov"/>
    </java>                  
</target>

答案 1 :(得分:4)

运行java程序有两种方法。使用“jar”选项是最方便的,并且称为可执行jar,但是为了使其工作,您需要在清单文件中指定Main类和classpath,如下所示:

<jar destfile="${jar.file}" basedir="${classes.dir}">
    <manifest>
        <attribute name="Main-Class" value="${jar.main.class}" />
        <attribute name="Class-Path" value="${jar.classpath}" />
    </manifest>
</jar>

有关如何执行此操作的更详细答案,请参阅:

Execute Java programs in a consistent environment

答案 2 :(得分:2)

试试这个:

<target name="jar" depends="clean,compile" >
   <jar destfile="./build/jar/DependencyFinder.jar">
    <fileset dir="./lib" includes="jbl.jar,mysql*.jar" />
    <fileset dir="./build/classes" excludes="**/form/*.class,**/orm/*.class,**/org/w3/xmldsig/*.class"/>
   </jar>
</target>