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

我有两个使用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文件的目录时,正如我期望的那样,只有1个projectA.jar文件。如何确定使用哪个文件,这并不重要?我只是好奇。

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

谢谢你的帮助。

最佳答案

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>

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

10-10 17:47