A expansão do conjunto de arquivos Ant não funciona
-
18-09-2020 - |
Pergunta
Recebo uma reação muito confusa do meu arquivo de construção ant e estou me perguntando se não sou inteligente o suficiente ou se isso pode realmente ser um bug.
Eu tenho a seguinte propriedade definida globalmente em meu projeto:
<property name="lib.dir" location="lib"/>
Então tentarei adicionar alguns arquivos deste diretório em um arquivo jar via conjunto de arquivos (mais de um recurso):
<fileset dir="${basedir}" includes="lib/*filename*"/>
Deveria haver (e existir) 3 bibliotecas diferentes, que são combinadas dessa forma.No entanto, se eu tentar usar o seguinte, não funcionará e nenhum arquivo será incluído:
<fileset dir="${basedir}" includes="${lib.dir}/*filename*"/>
Observe que as únicas diferenças estão no uso da propriedade global.Agora a pergunta simples:por que a primeira versão funciona como anunciado, mas a segunda não?
Solução
Verifique o valor real de "lib.dir" antes e talvez depois da tarefa que usa a expressão "fileset".Apenas para ter certeza de que não foi alterado acidentalmente depois de definido globalmente.O <echo/>
tarefa pode ajudar.
Talvez eu tenha conseguido a solução.A descrição do location
atributo é:
Define a propriedade para o nome de arquivo absoluto do arquivo fornecido.Se o valor deste atributo for um caminho absoluto, ele permanecerá inalterado (com os caracteres / e \ convertidos para as convenções atuais das plataformas).Caso contrário, é tomado como um caminho relativo à base do projeto e expandido.
Basta usar o value
atributo em vez de location
.Aqui está um script de teste para mostrar a diferença:
<project name="test">
<property name="test1" location="lib"></property>
<property name="test2" value="lib"></property>
<target name="target" description="description">
<echo>${test1}</echo>
<echo>${test2}</echo>
</target>
</project>
A saída no meu sistema é a seguinte:
Buildfile: D:\Develop\workspace-jabber\scrapbook\build.xml
target:
[echo] D:\Develop\workspace-jabber\scrapbook\lib
[echo] lib
BUILD SUCCESSFUL
Total time: 307 milliseconds
Outras dicas
Encontrei uma pista para a resposta, mas ainda não tudo.
Executei ambas as versões do conjunto de arquivos com ant -debug e aqui está o que acontece.
Na versão funcional e sem propriedade, recebo a seguinte saída:
fileset: Setup scanner in dir [pathToDir] with patternSet{ includes: [lib/*filename*] excludes: [] }
enquanto na versão deveria estar funcionando, mas não funciona, recebo:
fileset: Setup scanner in dir [pathToDir] with patternSet{ includes: [ [pathToDir]/lib/*filename*] excludes: [] }
Como você pode ver, ant adiciona o [pathToDir] no regexp, procurando assim por
[pathToDir]/[pathToDir]/lib/*filename*
o que obviamente não existe.Problema agora:como devo modificar minha versão para que funcione corretamente?
Ao criar a propriedade (é feito global ou em um destino?), o diretório lib
existir?Se não, o location
atributo não funciona - use um value
atributo em vez disso ou defina melhor a propriedade após criar o diretório.
Conforme indicado acima, o problema era que ${lib.dir} também continha o caminho inteiro, procurando assim por [pathToDir]/[pathToDir]/lib/nome do arquivo.
Para eliminar o indesejado [pathToDir] na propriedade ${lib.dir}, usei agora a tarefa.Eu tenho agora o seguinte, mas não tenho uma solução tão bonita:
<basename property="lib.dir.rel" file="${lib.dir}"/>
<fileset dir="${basedir}" includes="${lib.dir.rel}/*filename*"/>
P.S.:Olhando novamente, descobri que Andreas_D também encontrou ontem o motivo certo e uma boa sugestão, que devo ter esquecido :-/