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?

Foi útil?

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 locationatributo é:

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 :-/

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top