我正在尝试重新构建我的构建技术,用于创建依赖于常见第三方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标头?
答案 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插件,它在构建期间创建一个运行脚本,然后为我设置类路径,所以我不需要担心它。