繁体   English   中英

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

[英]ant, jar files, and Class-Path oh my

我试图重新构建我的构建技术,用于创建依赖于常见的第三方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标头?

这就是你所需要的:

<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。 这些其他构建系统已经考虑了许多常见的项目结构和构建操作,因此您不必将所有内容编写到最后的细节。

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

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

使用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>

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM