在Ant中从<classpath>生成清单类path

在下面的构build文件中,jar目标引用清单类path的jar.class.path属性。 编译目标指向project.class.path

这里有冗余,因为jar.class.path和project.class.path非常相似。 当库被添加时,它们必须被更新,如果库的列表变得很长,这可能是一个痛苦。 有没有更好的办法? 任何解决scheme都必须是跨平台的,并且始终使用相对path。

编辑:
它应该从文件集中生成JAR类path,而不是反过来,所以我可以使用通配符将所有的JAR文件包含在目录中。

<?xml version="1.0"?> <project name="Higgins" default="jar" basedir="."> <property name="jar.class.path" value="lib/forms-1.2.0.jar lib/BrowserLauncher.jar"/> <path id="project.class.path"> <pathelement location="build"/> <fileset dir="lib"> <include name="forms-1.2.0.jar"/> <include name="BrowserLauncher.jar"/> </fileset> </path> <target name="prepare"> <mkdir dir="build"/> </target> <target name="compile" depends="prepare" description="Compile core sources"> <javac srcdir="src" includes="**" destdir="build" debug="true" source="1.5"> <classpath refid="project.class.path"/> </javac> </target> <target name="jar" depends="compile" description="Generates executable jar file"> <jar jarfile="higgins.jar"> <manifest> <attribute name="Main-Class" value="nl.helixsoft.higgins.Main"/> <attribute name="Class-Path" value="${jar.class.path}"/> </manifest> <fileset dir="build" includes="**/*.class"/> <fileset dir="src" includes="**/*.properties"/> </jar> </target> </project> 

假设Ant 1.7或更高版本,您可以使用manifestclasspath任务。

 <path id="dep.runtime"> <fileset dir="./lib"> <include name="**/*.jar" /> </fileset> </path> <property name="dep_cp" value="${toString:dep.runtime}" /> <target name="default"> <manifestclasspath property="manifest_cp" jarfile="myjar.jar"> <classpath refid="dep.runtime" /> </manifestclasspath> <echo message="Build Classpath: ${dep_cp}" /> <echo message="Manifest Classpath: ${manifest_cp}" /> </target> 
 <path id="build.classpath"> <fileset dir="${basedir}"> <include name="lib/*.jar"/> </fileset> </path> <pathconvert property="manifest.classpath" pathsep=" "> <path refid="build.classpath"/> <mapper> <chainedmapper> <flattenmapper/> <globmapper from="*.jar" to="lib/*.jar"/> </chainedmapper> </mapper> </pathconvert> <target depends="compile" name="buildjar"> <jar jarfile="${basedir}/${test.jar}"> <fileset dir="${build}" /> <manifest> <attribute name="Main-Class" value="com.mycompany.TestMain"/> <attribute name="Class-Path" value="${manifest.classpath}"/> </manifest> </jar> </target> 

有关更多信息,请查阅这篇文章 。

如果您只想在两个(或更多)path之间共享一个公共的子path,那么很容易:

 <path id="lib.path> <fileset dir="lib"> <include name="forms-1.2.0.jar"/> <include name="BrowserLauncher.jar"/> </fileset> </path> <path id="project.class.path"> <pathelement location="build"/> <path refid="lib.path"/> </path> <property name="jar.class.path" refid="lib.path"/> 

编辑对不起,我误解了这个问题。 尝试这个:

 <property name="jar.class.path" value="lib/forms-1.2.0.jar lib/BrowserLauncher.jar"/> <path id="project.class.path"> <pathelement location="build"/> <fileset dir="." includes="${jar.class.path}"/> </path> 

您可以使用<pathconvert>将path(可以包含文件集)转换为纯string。 您可能需要将该string<echo>到文件中,使用<replace>或<replaceregexp>来切分前导path位,然后使用<loadfile>将操纵string加载到最终属性中。

执行工作留给读者。