蚂蚁,jar文件和Class-Path哦我的

时间:2009-07-27 21:14:14

标签: java ant jar

我正在尝试重新构建我的构建技术,用于创建依赖于常见第三方jar文件的Java jar文件。 (GlazedLists,Apache Commons等)

我一直把它们都放到{Java JRE dir} / lib / ext中,所以它们会被JRE自动看到,但是这会导致出现问题,比如不记得我需要分发某些jar文件,所以我会喜欢学会更明确。

所以我将它们全部移动到c:\ appl \ java \ common \中,将它们添加到Eclipse构建路径中,并在我的ant文件中定义它:

<path id="javac_classpath">
    <fileset dir="${libDir}">
        <include name="*.jar"/>
    </fileset>
    <fileset dir="c:/appl/java/common">
        <include name="*.jar"/>
    </fileset>
</path>

我将Class-Path清单标头设置为“。”在我的jar任务中但即使我将相关的jar文件放入与我的应用程序jar文件相同的目录中,这似乎也不起作用。我可以将它们一个一个地手动添加到Class-Path标头中,但我想知道,有没有更简单的方法来正确设置Class-Path标头?

6 个答案:

答案 0 :(得分:37)

这就是你所需要的:

<path id="build-classpath">
    <fileset dir="${dist}/lib">
        <include name="*.jar"/>
    </fileset>
</path>
<manifestclasspath property="lib.list" jarfile="${dist}/lib/myprog.jar">
    <classpath refid="build-classpath"/>
</manifestclasspath>
<jar jarfile="${dist}/lib/myprog.jar"
     basedir="${build}"
     includes="com/my/prog/**" >
    <manifest>
        <attribute name="Main-Class" value="com.my.prog.MyProg"/>
        <attribute name="Class-Path" value="${lib.list}"/>
    </manifest>
</jar>

正如您可能看到的,它假设您编译了Java类并将它们输出到${build}。它还假设您已将jar文件复制到${dist}/lib

也就是说,值得研究其他内置支持依赖关系的构建系统,例如Maven和Gradle。这些其他构建系统已经考虑了许多常见的项目结构和构建操作,因此您不必将所有内容编写到最后的详细信息。

答案 1 :(得分:4)

你想要的是mapper。 Flattenmapper可能是最简单的,但实质上你需要创建一个指定类路径的路径元素,然后在其上使用路径转换将其转换为可以包含在清单中的字符串。

编辑:您可以使用包含规则来构建路径元素,因此以jar结尾的目录中的所有内容都将是**/*.jar

答案 2 :(得分:3)

使用ant 1.7及之后,manifestclasspath任务就是前进的方法。 如果您使用1.7之前的ant版本,则manifestclasspath任务不存在。

以下结果相同: -

<path id="build.classpath">
    <fileset dir="${dist}/lib">
        <include name="*.jar" />
        <exclude name="myprog.jar" />
    </fileset>
</path>

<pathconvert property="lib.list" pathsep=" ">
    <path refid="build.classpath" />
    <mapper>
        <chainedmapper>
            <flattenmapper />
        </chainedmapper>
    </mapper>
</pathconvert>

<target name="generate.jar">
    <jar destfile="${dist}/lib/myprog.jar">
        <manifest>
            <attribute name="Main-Class"
                value="com.mypackage.MyClass" />
            <attribute name="Class-Path" value="${manifest.classpath}" />
        </manifest>
    </jar>
</target>

答案 3 :(得分:0)

默认情况下,出于安全原因,类路径目录不包含Jar文件。有人可以在那里放置一个jar文件,它可以在你不知情的情况下加载,覆盖你的代码。我知道有关于添加另一个标志或结束标记以允许将Jar文件添加到类路径的讨论,但是,如果我的内存服务,那将是版本7.但是,我在最后一部分可能是错的。

答案 4 :(得分:0)

jar文件的Class-Path清单标头要求您明确列出要包含的jar文件。 在类路径中列出一个目录意味着java将在该目录中查找.class文件,而不是jar文件。

答案 5 :(得分:-1)

由于您在Ant中,您可能不想切换,但Maven非常擅长识别您的所有依赖项,并且有多个工具可以将您的lib jar复制或组合在一起以进行分发。为了我的目的,我有一个Maven插件,它在构建期间创建一个运行脚本,然后为我设置类路径,所以我不需要担心它。