与Ant争吵

时间:2011-09-06 15:53:40

标签: java ant

我的项目有许多我从其他项目引用的依赖项。我现在正在编写build.xml文件,目前正在编写JAR任务。我想我会从大胆的假设开始,如果我希望我的JAR在Eclipse之外正常运行,我需要在JAR文件中包含每个引用的JAR依赖项的副本。

所以我现在需要在fileset任务下添加jar来指示Ant在JAR中包含这些依赖项。问题是,当我切换到Navigator View并尝试在我的项目中找到我的依赖项时,我找不到它们!对它们的唯一引用是在.classpath文件中引用它们的绝对URL,我假设它是Eclipse如何找到它们。

所以我的问题是,如何指示Ant在此.classpath文件中查找依赖项并将它们包含在我的JAR中?

我担心的是,我必须先将每个JAR手动复制到项目根目录下的目录中,然后在我的构建中引用该目录。但是,有很多的JAR,这意味着复制n-pastin会失去很多。

请不要给Ivy或Maven建议,我很清楚这些是我的情况的最佳解决方案,但由于这个问题范围之外的原因,它们是不可行的。

感谢您的帮助。

4 个答案:

答案 0 :(得分:0)

您希望您的项目生成可执行jar还是将其作为可提取和运行的可分发包的一部分?如果它不是您需要的可执行jar,那么您应该创建一个jar,其中只包含项目中的类和资源,而不包含任何相关的jar。然后,如果您想将项目作为可分发包发布,您可能会创建一个包含依赖项的zip和tar.gz。

我无法在Ant和Eclipse .classpath文件之间自动同步文件集。除了编写自己的工具,我以前见过。因此手动复制罐子可能是最快的解决方案。

答案 1 :(得分:0)

您可以将项目从Eclipse导出为Ant构建文件(右键单击项目,单击“导出”,选择“Ant构建文件”)。导出的build.xml文件将包含名为path的{​​{1}}元素。该<your project name>.classpath元素将包含构建应用程序所需的所有jar的路径。由于您要使用path,因此可以修改生成的fileset以重用build.xml

让Ant使用Eclipse的类路径的唯一方法是编写Ant,以便解析.classpath文件。

作为旁注,我不建议尝试将罐子放入罐子里。 Java无法从jar中的jar加载类(除非您编写自己的类加载器来执行此操作)。如果您确实需要,可以使用path。但是,正确的解决方案是在分发应用程序时将第三方jar放在应用程序的jar文件之外。然后在MANIFEST.MF文件中设置classpath属性以引用文件的路径(您可以重复使用上面的zipfileset作为MANIFEST.MF。

答案 2 :(得分:0)

如果您有很多依赖项,我认为复制和粘贴是最小的问题。主要问题是您在开发过程中不再具有模块化和灵活性。尝试减少它们并仅保留依赖项非常必要。为此,您可以使用Jdependmetrics或 - 都有Eclipse插件(或Class Dependency Analyzer)。

剩下的依赖项可以放在一个jar中(即所有类文件,而不是嵌套的jar),这对某些人来说可能很舒服,或者在每个单独的文件中都是外部的,这是更常见的对于用户可能已经拥有的第三方库特别有用。

我的观点是:模块化很好,无论是开发还是部署。

答案 3 :(得分:0)

您可以声明依赖的JAR路径标记,然后将其用作classpath的引用。例如,

<project basedir="." default="build.all" name="My Application">
<path id="myclasspath">
        <pathelement location="${project.syslib}/log4j-1.2.8.jar"/>
        <pathelement location="${project.syslib}/xalan.jar"/>
        <pathelement location="${project.syslib}/common.jar" />
        <fileset dir="${config.common}/taglib">
            <include name="**/*.jar"/>
          </fileset>
        <fileset dir="${config.csr}/taglib">
            <include name="**/*.jar"/>
          </fileset>
</path>
<target name="compile" depends="prepare" >
    <javac srcdir="${project.root}/src"
        destdir="${project.root.build}"
        classpathref="myclasspath"
        nowarn="yes"
        debug="on"
        fork="yes"
        memoryInitialSize="80m"
        memoryMaximumSize="256m"
    />
</target>
</project>  

此外,在Eclipse中,如果通过Add Jars按钮添加jar,则它使用相对路径。