蚂蚁战争任务如何运作?

时间:2009-10-13 22:46:23

标签: java ant build oc4j ear

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

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

让我们称它们为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文件。

所以第一个问题是:

蚂蚁如何将战争文件放在一起?我想如果它使用临时目录存储文件进行打包,我将无法拥有两个同名的文件?

第二:

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

这是问题的根源,因为projectA在不同的机器上构建不同,这本身就是另一个问题。但是从两者中选出的罐子始终是一致的,一台机器的构建总是有效,而另一台机器的构件则不然。

感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

WAR只是一个zip文件。因此可以包含两个具有相同名称的文件。在Ant manual

中甚至可以这样说
  

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

Ant不使用临时目录来构建WAR。这一切都是在记忆中完成的。

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

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

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

     

相关问题