Como funciona a tarefa de guerra de formigas?
Pergunta
Tenho uma pergunta sobre algo que encontrei hoje no trabalho.
Eu tenho dois projetos construídos com o script de construção da ANT.
Vamos chamá -los de Projeto e Projectb.
O Projeto Builds Projecta.jar e o Projectb Builds Projectb.war e ProjectB.ear.
O Projectb.war inclui Projecta.jar no diretório Lib-Inf-Inf.
No ProjectB, existe um diretório Lib e ele contém Projecta.jar.
Neste cenário de construção, o arquivo de construção do ProjectB atrai o projeto.jar diretamente do Projecta e também puxa o Projecta.jar do diretório LIB do ProjectB (eu conheço uma prática ruim, mas herdei este projeto e estou consertando -o :)) .
Portanto, quando a guerra e o arquivo de ouvido subsequentes são construídos, no diretório LIB da Web-Inf do Projectb.war, existem dois arquivos Projecta.jar.
Portanto, a primeira pergunta é:
Como Ant coloca o arquivo de guerra? Eu pensaria que se estiver usando um diretório temporário para armazenar os arquivos para embalagens, não seria capaz de ter dois arquivos com o mesmo nome?
Segundo:
Quando eu implanto isso no OC4J, e procuro no diretório que contém os arquivos de ouvido/guerra explodidos, há apenas 1 arquivo Projecta.jar, como eu esperaria. Como ele determina qual arquivo é usado, não é importante? Eu só estou curioso.
Essa era a fonte de problemas, pois o projeto estava se formando de maneira diferente em diferentes máquinas, outro problema em si. Mas o frasco que foi selecionado entre os dois sempre era consistente, uma construção de uma máquina sempre funcionava e uma de outra máquina não.
Obrigado pela ajuda.
Solução
Uma guerra é simplesmente um arquivo zip. E, como tal, pode conter dois arquivos com o mesmo nome. É até diz isso no Manual de formigas:
Observe que o formato ZIP permite que vários arquivos do mesmo nome totalmente qualificado existam em um único arquivo.
A Ant não usa um diretório temporário para construir a guerra. Tudo é feito na memória.
Como no Windows dois arquivos com o mesmo nome não podem existir, um deles é ignorado durante a extração. Não tenho certeza de qual é ignorado, mas meu palpite seria que o primeiro adicionado é o único extraído.
Para evitar esse tipo de erro, você precisa excluir especificamente um dos arquivos:
<war destfile="myapp.war" webxml="src/metadata/myapp.xml">
<lib dir="libs">
<exclude name="projectA.jar"/>
</lib>
<lib dir="projectAlibs"/>
...
</war>