2011-09-06 209 views
1

我的项目有很多依赖,我从其他项目引用。我现在正在编写build.xml文件,目前正在编写JAR任务。我想我会从大胆的假设开始,如果我期望我的JAR在Eclipse之外正确行为,那么我需要在JAR文件中包含每个引用的JAR依赖项的副本。与蚂蚁JARring

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

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

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

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

感谢您的任何帮助。

+0

首先我打破你的任何构建和eclipse项目之间的依赖关系。这听起来像你需要为应用程序的运行时类路径维护一组第三方jar。我只会在你的jar文件中包含你自己的源代码类,然后定义第二个ant目标,为你的应用程序构建运行时类路径。 – emeraldjava

+0

谢谢你的建议! – IAmYourFaja

回答

0

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

我不知道自动同步Ant和Eclipse .classpath文件之间的文件集。除了编写你自己的工具,我已经看到过。所以手动复制罐子可能是最快的解决方案。

0

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

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

作为一个便笺,我不建议尝试将罐子放在罐子里面。 Java不能从jar中的jar中加载类(除非你自己编写类加载器来做到这一点)。如果您绝对需要,您可以使用zipfileset。但是,正确的解决方案是在分发应用程序时,将第三方JAR包装在应用程序的jar文件之外。然后设置类路径属性在MANIFEST.MF文件中引用的文件的路径(你可以从上面重用<your project name>.classpath的MANIFEST.MF。

0

我觉得复制粘贴&是最小的问题,如果你有如此多的依赖关系,主要问题是在开发过程中你不再是模块化和灵活的。尽量减少它们,只保留必要的依赖关系。为此,您可以使用例如Jdependmetrics或者 - 都具有Eclipse插件(或Class Dependency Analyzer)。

剩下的依赖关系可以放在一个jar文件中(也就是所有的类文件,不是嵌套的jar文件),这可能会让某些人感到舒服,或者每个文件都在一个单独的文件中,这是比较常见的对于用户可能已经拥有的第三方库尤其有用。

我的观点是:模块化对于开发和部署都很好。

0

您可以声明相关的JAR路径标记,然后将其用作对类路径的引用。例如,

<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中如果添加罐通过添加罐按钮,然后它使用相对路径。