Ich arbeite an einem einfachen Build-Skript, das einige Konstanten aus einer Java-Klassendatei erhalten und sie als Versionsnummern in meinen Dateinamen verwenden soll. Ich benutze Eclipse und seine eigene Ant, aber setze bcel-5.2.jar in meinen libs-Ordner und in den Klassenpfad für den Ant-Aufruf.Ant loadproperties fehlgeschlagen (bcel error?)
<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>
Aber leider die Ant-Task LoadProperties versagt:
build.xml:46: expected a java resource as source
Danach habe ich versucht, Ant von außen Eclipse mit dieser Befehlszeile auszuführen:
set ANT_HOME=C:\Program Files\Java\ant\apache-ant-1.7.1
"%ANT_HOME%\bin\ant.bat"
Das Ergebnis ist
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
Ich bin jetzt wirklich verloren. Ist es ein Bcel-Fehler? Ist es eine Ant-Inkompatibilität mit meinem eigenen bcel?
Ein letzter Hinweis:
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)
UPDATE Nach der Einstellung der Ant-Einstellungen in Eclipse, die Fehlermeldung geändert:
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)
den bcel Classpath Eintrag aus dem Ant-Ziel führt dies Entfernen
Jetzt denke ich, es ist vielleicht ein Versionskonflikt zwischen Ant und BCEL. Oder BCEL und JDK1.6. Oder Eclipse und BCEL und Ant oder JDK ... Ich bin verloren.
ANTWORT:
Dies ist der Kommentar unten
gefundensollte ich das erwähnt haben - Sie brauchen nichts zu konvertieren. Doc: "seit Ant 1.7, wird die Zeichenkodierung ISO-8859-1 verwendet, um von Zeichen zurück in Bytes zu konvertieren, so dass man diese Kodierung zum Lesen der Java-Klassendatei verwenden muss." Dies ist nur eine Konvention um die Tatsache zu umgehen, dass ein Zeichenfilter auf rohen Bytes verwendet wird. ant.apache.org/manual/CoreTypes/... UTF-8 wäre schlecht! - McDowell
Ich denke, das wird auf einige Kompatibilitätsprobleme mit BCEL und dem JDK kommen. "ist keine Java-.class-Datei" verweist auf eine nicht übereinstimmende Klassenversion (die ersten 4 Bytes in .class), die von BCEL nicht erkannt wird. Ich versuche erneut mit JDK1.4 zu kompilieren. – cringe