2009-07-27 119 views
20

我想重新构建我的构建技术,以创建依赖于常见的第三方jar文件的Java jar文件。 (GlazedLists,Apache Commons等)蚂蚁,jar文件和类路径哦我的

我一直把它们全部装入{Java JRE dir}/lib/ext中,这样它们会自动被JRE看到,但是这导致了像不记得我需要的问题分发某些jar文件,所以我想学习更明确。

所以我搬到他们都到C:\申请\ java的\ COMMON \,将它们添加到Eclipse的构建路径,A和我的蚂蚁文件中定义的:

<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头部设置?

回答

36

这就是你需要:

<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

ahhhh ...这就是我一直在寻找的东西。优秀! – 2009-07-28 13:38:02

0

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

0

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

4

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

编辑:您可以使用包括规则构建路径元素,所以一切都在罐子结尾的目录将是**/*.jar

-1

既然你在蚂蚁的时候,你可能不希望进行切换,但Maven的非常擅长识别所有的依赖关系,并且有几个工具可以将你的lib jar复制或合并在一起用于分发目的。为了我的目的,我有一个Maven插件,它在构建过程中创建了一个运行脚本,这又为我设置了类路径,所以我不需要担心它。

+0

常春藤是一个非常蚂蚁兼容的方式做依赖管理。 – 2009-10-19 14:42:20

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>