如何执行涉及许多项目的大蚂蚁脚本的良好重构?

时间:2013-10-08 15:25:09

标签: java eclipse ant jar

我是Ant的新人(我来自Maven,此时,Ant是我的噩梦)。

我有以下情况:

在Eclipse工作区中,我有一些Java项目,它们相互交互,构成最终的单个应用程序。

实现应用程序GUI的项目之一(名为 CrystalIceGUI )本身包含唯一的 build.xml Ant脚本,该脚本最多可以简化,执行以下操作:

1)编译所有项目(被视为CrystalIceGUI项目的依赖项)

2)对于每个项目,创建一个名为发布的目录(在适当的项目中),并在其中输入与此项目相关的 .jar 文件。 (例如,其中一个项目名为 ShellExtBridge ,因此Ant脚本将创建以下目录: ShellExtBridge / Release 并将创建的 .jar 此目录中 ShellExtBridge 的文件。

3)最后为主项目创建以下结构( CrystalIceGUI ):在 CrystalIceGUI 项目中创建名为 Relaese 的目录此目录放置与CrystalIceGUI项目相关的 .jar文件

此外,创建此目录 CrystalIceGUI / Release / lib ,其中包含之前为依赖项目项目创建的所有 .jar

现在我的问题是:老板要求我为每个项目创建一个单独的Ant脚本。这些Ant脚本只需在每个项目中创建一个 Release 文件夹,为项目创建jar并将jar放在此Release文件夹中。但我对如何做到这一点感到有点困惑。

我的想法是这样的:对于每个项目,我从旧的Ant脚本(执行主项目中所有工作的脚本)中获取与我正在工作的项目相关的部分。

例如,对于名为 ShellExtBridge 的上一个子项目:我从旧的 build.xml ant脚本中获取此部分代码:

<target name="shellextbridge" 
    description="Packs classes of shellextbridge">
    <mkdir dir="${project.libdir}" />
    <javac srcdir="${deps.shellextbridge.dir}/Project/src" destdir="${deps.shellextbridge.dir}/Project/bin"/>
    <jar destfile="${deps.shellextbridge.dir}/Release/${deps.shellextbridge.jar}" index="false">
        <fileset dir="${deps.shellextbridge.dir}/Project/bin"/>
        <manifest>
            <attribute name="Created-By" value="${info.software.author}" />
            <attribute name="Main-Class" value="com.techub.crystalice.rmi.Main"/>
        </manifest>
    </jar>
    <copy file="${deps.shellextbridge.dir}/Release/${deps.shellextbridge.jar}" tofile="${project.libdir}/${deps.shellextbridge.jar}"/>
    <copy file="${deps.shellextbridge.dir}/Release/${deps.shellextbridge.jar}" tofile="${project.deploy}/lib/${deps.shellextbridge.jar}"/>
    <copy file="${deps.shellextbridge.dir}/Release/${deps.shellextbridge.jar}" tofile="${project.dev.deploy.dir}/${deps.shellextbridge.jar}"/>
</target>

我把它放到一个新的 build.xml ant脚本中,该脚本特定于 ShellExtBridge 项目(改变路径)

做他们问我的好方法可以吗?

很抱歉,如果我住过但是从未见过蚂蚁,直到昨天我对如何采取行动有很多疑问

TNX

安德烈

2 个答案:

答案 0 :(得分:1)

来自Maven你已经习惯了标准的项目源代码布局,你也熟悉构建插件。

首先,我建议识别构建逻辑的常用部分,并考虑创建一组ANT macrodefs。接下来研究如何创建ANTlib来保存构建的宏定义。这将是一个jar文件,可以包含在每个构建中,保存公共构建逻辑。

最后,如果您决定在ANTLIB中保留您的通用逻辑,这意味着您可以支持构建版本控制,模拟Maven如何支持不同版本的构建插件。在需要进行更改而不破坏旧版本的情况下非常有用。

有关详细信息,请参阅以下答案:

答案 1 :(得分:0)

关于定义公共构建逻辑;在多个项目中重复使用它;在Ant中定义公共构建阶段,我建议你看看Netbeans如何设置它的项目。这将使您对build.xml重用有足够的了解。

让我们说你开始确定5个阶段 - 清洁,初始化,构建,分散,释放(等)。您可以创建一个基本文件(可能位于$ root.dir / build / common.xml)。在此文件中,您可以继续创建调用目标的序列。

现在,如果你看一下Netbeans如何设置项目,你会注意到一个目标 - 比如说 build - 会调用目标 -pre-build,-do-build,-post-构建。实际上,所有实际代码都存在于这些附加目标中。这样做的好处是,在单个模块中(已导入此common.xml),您只能覆盖需要特殊处理的构建部分。

这样,您可以将每个项目单独移动到模块化构建系统。

一旦你运行了基本脚本,那么你可以考虑利用像Ivy(依赖管理)这样的库来处理包装等。

或者,如果您计划将事物移动到可扩展的&amp;模块化系统,那么我也建议您使用Gradle - 这是一个基于Java的Ant友好构建平台。我之所以这样做是因为,你最终会最终构建自定义任务或者为了满足小的需求而做一大堆的工作......你可以通过脚本代码更好地完成它。

希望这会对你有所帮助。