Java 在旧Ant项目中添加常春藤

Java 在旧Ant项目中添加常春藤,java,eclipse,build,ant,ivy,Java,Eclipse,Build,Ant,Ivy,我已经读过一些文章,但我不明白如何为依赖项设置常春藤文件。我正在处理的项目很旧,我不太了解它,我有一个半生成半编辑的build.xml文件,它与Eclipse编译器一起工作。这是我第一次处理构建配置,我想将依赖项移到ivysettings.xml文件中,并改进可以改进的内容。我的目标是创建一个在Tomcat中部署的war 最好的方法是什么 build.xml: <?xml version="1.0" encoding="UTF-8" standalo

我已经读过一些文章,但我不明白如何为依赖项设置常春藤文件。我正在处理的项目很旧,我不太了解它,我有一个半生成半编辑的build.xml文件,它与Eclipse编译器一起工作。这是我第一次处理构建配置,我想将依赖项移到ivysettings.xml文件中,并改进可以改进的内容。我的目标是创建一个在Tomcat中部署的war

最好的方法是什么

build.xml:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project basedir="." default="build" name="Teamwork"
    xmlns:ivy="antlib:org.apache.ivy.ant">
    <property environment="env"/>
    <property name="ECLIPSE_HOME" value="../../../../../Program Files/eclipse/"/>
    <property name="debuglevel" value="source,lines,vars"/>
    <property name="target" value="1.7"/>
    <property name="source" value="1.7"/>
    <path id="Web App Libraries.libraryclasspath">
        <pathelement location="WebContent/WEB-INF/lib/Tidy.jar"/>
        <pathelement location="WebContent/WEB-INF/lib/antlr-2.7.7.jar"/>
        <pathelement location="WebContent/WEB-INF/lib/asm-attrs.jar"/>
        <pathelement location="WebContent/WEB-INF/lib/asm.jar"/>
        <pathelement location="WebContent/WEB-INF/lib/avro-1.5.1.jar"/>
        <pathelement location="WebContent/WEB-INF/lib/aws-java-sdk-1.5.5.jar"/>
        <pathelement location="WebContent/WEB-INF/lib/bsh-2.0b4.jar"/>
        <pathelement location="WebContent/WEB-INF/lib/c3p0-0.9.2.1.jar"/>
        <pathelement location="WebContent/WEB-INF/lib/commons-beanutils.jar"/>
        [... other jars]
    </path>
    <path id="EAR Libraries.libraryclasspath"/>
    <path id="Teamwork.classpath">
        <pathelement location="bin"/>
        <path refid="Web App Libraries.libraryclasspath"/>
        <path refid="EAR Libraries.libraryclasspath"/>
    </path>
    <target name="init">
        <mkdir dir="bin"/>
        <copy includeemptydirs="false" todir="bin">
            <fileset dir="src">
                <exclude name="**/*.java"/>
            </fileset>
        </copy>
    </target>
    <target name="clean">
        <delete dir="bin"/>
    </target>
    <target depends="clean" name="cleanall"/>
    <target depends="build-subprojects,build-project" name="build"/>
    <target name="build-subprojects"/>
    <target depends="init" name="build-project">
        <echo message="${ant.project.name}: ${ant.file}"/>
        <javac debug="true" debuglevel="${debuglevel}" destdir="bin" includeantruntime="false" source="${source}" target="${target}">
            <src path="src"/>
            <classpath refid="Teamwork.classpath"/>
        </javac>
    </target>
    <target description="Build all projects which reference this project. Useful to propagate changes." name="build-refprojects"/>
    <target description="copy Eclipse compiler jars to ant lib directory" name="init-eclipse-compiler">
        <copy todir="${ant.library.dir}">
            <fileset dir="${ECLIPSE_HOME}/plugins" includes="org.eclipse.jdt.core_*.jar"/>
        </copy>
        <unzip dest="${ant.library.dir}">
            <patternset includes="jdtCompilerAdapter.jar"/>
            <fileset dir="${ECLIPSE_HOME}/plugins" includes="org.eclipse.jdt.core_*.jar"/>
        </unzip>
    </target>
    <target description="compile project with Eclipse compiler" name="build-eclipse-compiler">
        <property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/>
        <antcall target="build"/>
    </target>
</project>

[…其他罐子]

第一步是去掉
块;这就是你正在重构的基于常春藤的解决方案。您需要一个列出依赖项的
ivy.xml
文件。我们可以找到一个例子——这是一个非常复杂的例子,而你的例子可能更简单。我建议
测试
运行时
构建
配置,除非您有迫切需要,否则您不需要更多。然后,对于每个依赖项,找出需要它的上下文(如果在编译“build”时需要在cp上使用它。如果在运行“runtime”时需要在cp上使用它。只有在用于测试时才将它放入“test”配置中,其他什么都不需要(因此,通常是junit,仅此而已)

然后在ant文件中,您希望执行以下操作:

<ivy:resolve file="buildScripts/ivy.xml" refresh="true" conf="build, runtime, test" />  
<ivy:retrieve/>


这将使那些jar出现在
lib/test
lib/runtime
lib/build
中。使用start ant技巧创建一个对象(不要显式列出每个jar)。当您删除依赖项时,这会造成严重破坏,因为这不会使jar文件消失,但只需ant清理可能更简单(除了
构建
,现在还应该删除
目录)。有一些方法可以使ant
对象脱离配置,但这更复杂。

ant和Ivy已经过时。如果你正在努力,我建议你迁移到Maven。我看不到迁移到Maven项目的理由仅仅因为“它更新了”如果这是可行的。但是,在直接迁移到Maven之前集成Ivy将有助于这一过程。这并不是说Maven较新。Ivy更擅长管理依赖关系。事实上,Ivy已经很旧了。没有人再使用Ant或Ivy了。看看所有的开源Java项目。它们都使用Maven或Gradle。Ant已经消失了。在我的情况下,现在不需要这样做。可能会考虑将来的改进。现在,这样做是没有目的的。谢谢你的建议,tho。我应该把
ivy:resolve
放在哪个块中,以便从eclipse编译器中获取?没关系,只要它在你做需要依赖关系的事情之前运行就行了例如,在生成eclipse项目文件之前(如果您的ant脚本这样做),在编译之前(如果您的ant脚本这样做),在测试之前,等等。