java - 蚁战任务如何进行?

标签 java ant build oc4j ear

我对今天在工作中遇到的事情有疑问。

我有两个使用 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 文件。它如何确定使用哪个文件,不重要?我只是好奇。

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

感谢您的帮助。

最佳答案

WAR 只是一个 zip 文件。因此可以包含两个同名文件。 Ant manual 中甚至这样说:

Please note that the Zip format allows multiple files of the same fully-qualified name to exist within a single archive.

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

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

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

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

关于java - 蚁战任务如何进行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1563379/

相关文章:

android - 在应用程序启动时突然收到 Firebase java.lang.IllegalAccessError

java - 根据自定义对象属性从 arraylist 中删除元素

eclipse - ant 脚本中私有(private)目标和公共(public)目标的区别

reactjs - travis 无法构建,因为错误 : Cannot find module 'react-test-renderer/shallow'

java - 尝试构建 FBReaderJ 时出现构建失败错误(https ://github. com/geometer/FBReaderJ)

ant - 从 Gradle 调用 Ant 任务时如何拦截或提升日志消息

mysql - 搜索用于检查 (My)SQL 语法的工具

java - 使用 double 返回比较器的比较方法?

java - 为什么 "selectedCountry"、 "selectedAge"、 "selectedGender"返回 null ?

java - OC4J 到 Weblogic 的迁移步骤