Apache ant manifestclasspath - 如何防止jar文件目录catch-22?

时间:2013-10-03 21:59:18

标签: java ant classpath

缺点是:如何在<{em> jarfile标记的<manifestclasspath>参数检查之前确保我的构建目录是否已创建?我正在使用ant 1.9.2。

这是一个最小的例子,除非我提前创建build目录,否则将失败:

 <path id="master-classpath">
      <pathelement path="src"/>
      <pathelement location="lib/dom4j-1.6.1.jar"/>
 </path>


 <manifestclasspath property="lib.list" jarfile="build/jar/HelloWorld.jar">
    <classpath refid="master-classpath" />
 </manifestclasspath>


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


<target name="build">
    <mkdir dir="build/classes"/>
    <javac destdir="build/classes" includeantruntime="false" >
           <src path="src"/>
           <classpath refid="master-classpath"/>
      </javac>
</target>


<target name="jar">
    <mkdir dir="build/jar"/>
    <jar destfile="build/jar/HelloWorld.jar" basedir="build/classes">
        <manifest>
            <attribute name="Main-Class" value="HelloWorld"/>
                <attribute name="Class-Path" value="${lib.list}"/>
        </manifest>
    </jar>
</target>


<target name="run">
    <java jar="build/jar/HelloWorld.jar" fork="true"/>
</target>

<path id="master-classpath"> <pathelement path="src"/> <pathelement location="lib/dom4j-1.6.1.jar"/> </path> <manifestclasspath property="lib.list" jarfile="build/jar/HelloWorld.jar"> <classpath refid="master-classpath" /> </manifestclasspath> <target name="clean"> <delete dir="build"/> </target> <target name="build"> <mkdir dir="build/classes"/> <javac destdir="build/classes" includeantruntime="false" > <src path="src"/> <classpath refid="master-classpath"/> </javac> </target> <target name="jar"> <mkdir dir="build/jar"/> <jar destfile="build/jar/HelloWorld.jar" basedir="build/classes"> <manifest> <attribute name="Main-Class" value="HelloWorld"/> <attribute name="Class-Path" value="${lib.list}"/> </manifest> </jar> </target> <target name="run"> <java jar="build/jar/HelloWorld.jar" fork="true"/> </target>

我的jar文件的目录当然是我的构建目录。在构建之前,我的构建目录不存在。构建目录的每个子目录都由相应的目标创建 - 目录上的compile调用mkdirclasses创建jar目录。我认为这都很标准。

现在就是这样:jar标签在任何任务之前被读入,因为它加载了一个变量。所以其他目标还没有运行。并且由于缺少目录,目标从不运行 - 我必须在运行ant之前手动创建<manifestclasspath>目录,这非常愚蠢。

当然,提前创建build/jar目录没什么大不了的。但如果人们试图自己安装我的软件,那肯定会让它变得更难。无论如何,在构建之前,构建永远不会存在!我应该做什么?

1 个答案:

答案 0 :(得分:1)

尝试并使用创建jar文件的目标中的manifestclasspath任务。

请参阅以下示例: