views:

823

answers:

3

I'm working on a simple build script that should get some constants from a java class file and use them as the version numbers in my file names. I use Eclipse and its own Ant, but put bcel-5.2.jar in my libs folder and into the classpath for the Ant call.

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

But unfortunatly the ant task loadproperties fails:

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

After that I tried to run Ant from outside Eclipse, using this command line:

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

The result is

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

I'm really lost now. Is it a bcel error? Is it an Ant incompatibility with my own bcel?

One last hint: Removing the bcel classpath entry from the Ant target results in this:

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 After setting the Ant preferences in Eclipse, the error message changed:

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)

Now I think it's maybe a version conflict between Ant and BCEL. Or BCEL and JDK1.6. Or Eclipse and BCEL and Ant or JDK... I'm lost.


ANSWER:

This is the comment found below

I should have mentioned this - you do not need to convert anything. Doc: "since Ant 1.7, the character encoding ISO-8859-1 is used to convert from characters back to bytes, so ONE HAS TO USE THIS ENCODING for reading the java class file." This is just a convention to get round the fact that a character filter is being used on raw bytes. ant.apache.org/manual/CoreTypes/… Using UTF-8 would be bad! – McDowell

A: 

Looks like a classpath error. Run "ant -v" to give you some more detail on errors.

A: 
McDowell
Ah, that helped - at least for some seconds. I updated the question.
cringe
+1  A: 

Crap, I knew it! It comes down to file encoding issues. The files are still in ISO-8819-1, but I'm using UTF-8. The project is pretty aged and was created with the wrong encoding in place. Setting the parameter encoding in the javac and loadproperties Task fixes it.

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

I thought it got changed by our Subversion server, but I think I have to convert every single file to UTF-8 myself now... think that is another question for SO.

cringe
I should have mentioned this - you do not need to convert anything. Doc: "since Ant 1.7, the character encoding ISO-8859-1 is used to convert from characters back to bytes, so ONE HAS TO USE THIS ENCODING for reading the java class file." This is just a convention to get round the fact that a character filter is being used on raw bytes. http://ant.apache.org/manual/CoreTypes/filterchain.html Using UTF-8 would be bad!
McDowell
Hm, I'm not 100% sure if I get it right. I will re-run the build with the converted files and the original ones and apply/remove the encoding parameter to get an answer. But I'll commit the converted files first... ;-)
cringe
Ok, really the only flaw was the missing parameter encoding="iso-8859-1". Thanks @McDowell! I guess I should've RTFM the whole filterchain. :-(
cringe
@McDowell Too bad I can't accept your comment as an answer...
cringe