LoadProperties formiga falhou (erro BCEL?)
-
22-08-2019 - |
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
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 .
(fonte: eclipse. org )
Parece que um erro de classpath. Execute "ant -v" para lhe dar mais alguns detalhes sobre os erros.