Pergunta

Eu estou trabalhando em um script de construção simples que deve obter algumas constantes a partir de um arquivo de classe Java e usá-los como os números de versão em meus nomes de arquivo. Eu uso o Eclipse e sua própria Ant, mas put BCEL-5.2.jar em meus libs pasta e para o classpath para a chamada Ant.

<target name="generate_version" depends="compile">
    <loadproperties srcfile="${dir.dest}/MyVersion.class">
        <classpath>
            <fileset dir="${dir.libs}">
                <include name="**/bcel*.jar"/>
            </fileset>
        </classpath>

        <filterchain>
            <classconstants/>
        </filterchain>
    </loadproperties>
</target>

Mas infelizmente a tarefa formiga LoadProperties falha:

build.xml:46: expected a java resource as source

Depois que eu tentei correr Formiga de fora Eclipse, usando esta linha de comando:

set ANT_HOME=C:\Program Files\Java\ant\apache-ant-1.7.1
"%ANT_HOME%\bin\ant.bat"

O resultado é

Buildfile: build.xml

init:
     [echo] Building project.
     [echo] ant.home:          C:\Program Files\Java\ant\apache-ant-1.7.1
     [echo] ant.java.version:  1.6
     [echo] ant.version:       Apache Ant version 1.7.1 compiled on June 27 2008

compile:
    [javac] Compiling 262 source files to **********\build
    [javac] Note: Some input files use or override a deprecated API.
    [javac] Note: Recompile with -Xlint:deprecation for details.
    [javac] Note: Some input files use unchecked or unsafe operations.
    [javac] Note: Recompile with -Xlint:unchecked for details.

generate_version:

BUILD FAILED
********************\ant\build.xml:46: expected a java resource as source

Estou realmente perdido agora. É um erro de BCEL? É uma incompatibilidade Formiga com minha própria BCEL?

Uma última dica: Removendo a entrada BCEL classpath a partir dos resultados alvo Ant nisto:

Buildfile: build.xml

init:
     [echo] Building project.
     [echo] ant.home:          C:\Program Files\Java\ant\apache-ant-1.7.1
     [echo] ant.java.version:  1.6
     [echo] ant.version:       Apache Ant version 1.7.1 compiled on June 27 2008

compile:
    [javac] Compiling 262 source files to ********************\build
    [javac] Note: Some input files use or override a deprecated API.
    [javac] Note: Recompile with -Xlint:deprecation for details.
    [javac] Note: Some input files use unchecked or unsafe operations.
    [javac] Note: Recompile with -Xlint:unchecked for details.

generate_version:

BUILD FAILED
java.lang.NoClassDefFoundError: org/apache/bcel/classfile/ClassParser
        at org.apache.tools.ant.filters.util.JavaClassHelper.getConstants(JavaClassHelper.java:47)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

Atualizar Depois de definir as preferências Ant no Eclipse, a mensagem de erro mudou:

BUILD FAILED
*********************\build.xml:46: org.apache.bcel.classfile.ClassFormatException:  is not a Java .class file
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:115)
    at org.apache.tools.ant.Task.perform(Task.java:348)
    at org.apache.tools.ant.Target.execute(Target.java:357)
    at org.apache.tools.ant.Target.performTasks(Target.java:385)
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1329)
    at org.apache.tools.ant.Project.executeTarget(Project.java:1298)
    at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
    at org.eclipse.ant.internal.ui.antsupport.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:32)
    at org.apache.tools.ant.Project.executeTargets(Project.java:1181)
    at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.run(InternalAntRunner.java:423)
    at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.main(InternalAntRunner.java:137)

Agora eu acho que é talvez um conflito de versões entre Ant e BCEL. Ou BCEL e JDK1.6. Ou Eclipse e BCEL e Ant ou JDK ... Eu estou perdido.


RESPOSTA:

Este é o comentário encontrado abaixo

Eu deveria ter mencionado isso - você não precisa converter nada. Doc: "desde Ant 1,7, a codificação ISO-8859-1 é usado para converter a partir de caracteres para trás bytes, então um tem que usar essa codificação para a leitura do arquivo de classe java." Esta é apenas uma convenção de contornar o fato de que um filtro de caracteres está sendo usado em bytes crus. ant.apache.org/manual/CoreTypes/... Usando UTF-8 seria ruim! - McDowell

Foi útil?

Solução

Droga, eu sabia! Tudo se resume a problemas de codificação de arquivo. Os arquivos ainda estão em ISO-8819-1, mas eu estou usando UTF-8. O projeto é bastante idade e foi criado com a codificação errada no lugar. A definição do parâmetro codificação na javac e LoadProperties correções tarefa de TI.

<target name="generate_version" depends="compile">
    <loadproperties encoding="iso-8859-1" srcfile="${dir.dest}/MyVersion.class">
        <filterchain>
            <classconstants/>
        </filterchain>
    </loadproperties>
</target>

Eu pensei que foi modificado pelo nosso servidor Subversion, mas eu acho que tem que converter todos os arquivos para UTF-8-me agora ... acho que é outra pergunta para SO.

Outras dicas

O documentação para LoadProperties diz que o aninhados classpath elemento é para uso com o recurso atributo -. alternativa ao uso de SRCFILE

Adicione o jar BCEL para o seu caminho de classe global. Em Eclipse, adicioná-lo como uma entrada global para o seu classpath no preferências de tempo de execução . Na linha de comando, use o interruptor -LIB .

text alt
(fonte: eclipse. org )

Parece que um erro de classpath. Execute "ant -v" para lhe dar mais alguns detalhes sobre os erros.

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