我的项目有许多依赖关系,我从其他项目引用。我现在正在编写build.xml文件,目前正在编写JAR任务。我想我将从大胆的假设开始:如果我希望我的JAR在Eclipse之外能够正确地工作,我将需要在JAR文件的某个位置包含每个引用的JAR依赖项的副本。
所以我现在需要在jar
任务下添加一个fileset
,以指示Ant在JAR中包含这些依赖项。问题是,当我切换到Navigator View并试图在我的项目中找到我的依赖项时,我找不到它们!对它们的唯一引用是在一个.classpath
文件中,该文件引用了它们的绝对url,我认为Eclipse就是这样找到它们的。
所以我的问题是,我如何指示Ant在这个.classpath文件中查找依赖项并将它们包含在我的JAR中?
我担心的是,我必须首先手动将每个JAR复制到项目根目录下的目录中,然后在构建中简单地引用该目录。但是有很多的jar文件,这意味着很多时间会被copy-n-pastin所浪费。
请不要建议Ivy或Maven,我很清楚这些是我的情况的最佳解决方案,但由于这个问题范围之外的原因,它们是不可行的。
谢谢你的帮助
您希望您的项目生成一个可执行的jar文件,还是将它作为提取并运行的可分发包的一部分?如果它不是你需要的可执行jar,那么你应该创建一个只包含项目中的类和资源的jar,而不包含任何依赖的jar。然后,如果你想将你的项目作为一个可分发包发布,你可能会创建一个zip和tar.gz,其中包括依赖项。
据我所知,没有办法在Ant和Eclipse .classpath文件之间自动同步文件集。除了编写自己的工具,我以前见过这样做。因此,手工复制jar文件可能是最快的解决方案。
您可以将项目从Eclipse导出为Ant构建文件(右键单击项目,单击export,选择Ant build file)。导出的build.xml文件将包含一个名为<your project name>.classpath
的path
元素。path
元素将包含构建应用程序所需的所有jar的路径。既然您想使用fileset
,那么您可以修改生成的build.xml
以重用该path
。
让Ant使用Eclipse的类路径的唯一方法是编写Ant,以便它解析.classpath文件。
作为旁注,我不建议尝试把罐子放在罐子里。Java不能在jar中加载来自jar的类(除非您编写自己的类加载器来实现这一点)。如果绝对需要,您可以使用zipfileset
。但是,正确的解决方案是在分发应用程序时将第三方jar捆绑在应用程序的jar文件之外。然后在MANIFEST中设置classpath属性。MF文件引用文件的路径(您可以重用上面的<your project name>.classpath
用于MANIFEST.MF.
您可以声明依赖的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中,如果您通过add jars按钮添加jar,那么它将使用相对路径。
我认为如果你有这么多依赖项,复制粘贴是最小的问题。主要的问题是,在开发过程中你不再是模块化和灵活的。尽量减少它们,只保留真正必要的依赖项。为此,您可以使用Jdepend或metrics,或者两者都有Eclipse插件(或类依赖分析器)。
剩下的依赖项可以放在一个jar中(即所有类文件,而不是嵌套的jar),这可能对某些人来说很舒服,或者可以放在每个单独的外部文件中,这对于用户可能已经拥有的第三方库来说更常见,也特别有用。
我的观点是:模块化是好的,无论是开发还是部署。