【问题标题】:How to execute a good refactor of a big ant script that involves many projects?一个涉及很多项目的大蚂蚁脚本如何执行好重构?
【发布时间】:2013-10-08 15:25:08
【问题描述】:

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

我有以下情况:

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

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

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

2) 为每个项目创建一个名为 Release 的目录(在适当的项目中)并将与该项目相关的 .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

安德烈亚

【问题讨论】:

    标签: java eclipse ant jar


    【解决方案1】:

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

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

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

    更多详情请看以下答案:

    【讨论】:

    • +1.. 只是对 OP 的说明,我有 30 多个项目(C、C++、Java)用不超过 10 行代码的单个 ant 脚本编译,结合了宏定义的概念和蚂蚁库。一旦 CI 进入画面 a.la,它就变得非常容易。詹金斯/哈德森。我强烈建议从 ANTLIB 方法开始,
    【解决方案2】:

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

    假设您从确定 5 个阶段开始 - clean、init、build、dist、release(等等)。您可以创建一个基本文件(可能位于 $root.dir/build/common.xml)。在此文件中,您可以继续创建将调用目标的序列。

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

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

    一旦您运行了基本脚本,您就可以考虑利用 Ivy(依赖管理)等库来处理打包等。

    或者,如果您打算将事物转移到可扩展和模块化的系统,那么我也建议您使用 Gradle - 这是一个对 Ant 友好、基于 Java 的构建平台。我建议这样做的原因是,您最终会构建自定义任务或做一大堆杂耍来满足小需求......您可能可以通过脚本代码做得更好。

    希望对你有所帮助。

    【讨论】:

      猜你喜欢
      • 2011-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多