【问题标题】:How does the ant war task work?蚁战任务是如何工作的?
【发布时间】:2011-09-29 17:57:44
【问题描述】:

我有一个关于我今天在工作中遇到的事情的问题。

我有两个使用 ant 构建脚本构建的项目。

让我们称它们为 projectA 和 projectB。

ProjectA 构建 projectA.jar,projectB 构建 projectB.war,projectB.ear。

ProjectB.war 在 web-inf lib 目录中包含 projectA.jar。

在 projectB 中有一个 lib 目录,其中包含 projectA.jar。

在这个构建场景中,projectB 的构建文件直接从 projectA 拉入 projectA.jar,它还从 projectB lib 目录拉入 projectA.jar(我知道不好的做法,但我继承了这个项目,并且正在修复它:))。

所以当war和后续的ear文件构建时,在projectb.war的web-inf lib目录下有两个projectA.jar文件。

所以第一个问题是:

ant是怎么把war文件放在一起的?我想如果它使用临时目录来存储用于打包的文件,我将无法拥有两个同名的文件?

第二个:

当我在 OC4J 上部署它并查看包含已分解的 ear/war 文件的目录时,正如我所料,只有 1 个 projectA.jar 文件。它如何确定使用哪个文件,并不重要?我只是好奇。

这是问题的根源,因为项目 A 在不同机器上的构建方式不同,这本身就是另一个问题。但是从两者中选择的 jar 始终是一致的,从一台机器构建总是可以工作,而从另一台机器构建则不会。

感谢您的帮助。

【问题讨论】:

    标签: java ant build oc4j ear


    【解决方案1】:

    WAR 只是一个 zip 文件。因此可以包含两个具有相同名称的文件。甚至在Ant manual中也是这么说的:

    请注意,Zip 格式允许 多个相同的文件 完全限定名称存在于 单个存档。

    Ant 不使用临时目录来构建 WAR。这一切都在内存中完成。

    由于在 Windows 中不能存在两个同名文件,因此在提取过程中会忽略其中一个文件。我不确定哪个被忽略,但我的猜测是添加的第一个是唯一提取的。

    为避免此类错误,您需要专门排除其中一个文件:

    <war destfile="myapp.war" webxml="src/metadata/myapp.xml">
      <lib dir="libs">
        <exclude name="projectA.jar"/>
      </lib>
      <lib dir="projectAlibs"/>
    ...
    </war>
    

    【讨论】:

    • 谢谢,是的,我排除了没有问题的文件,我主要是好奇 ant 和 zip 创建的后台发生了什么。
    猜你喜欢
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    相关资源
    最近更新 更多