调试ant UnsupportedClassVersionError

时间:2011-06-30 16:18:27

标签: java exception ant jboss

由于运行ant package(这应该创建一个JBoss .ear包),我得到以下异常跟踪:

$ ant package
Buildfile: /usr/local/src/appname/build.xml

init:
     [echo] Classpath = ${java.classpath}

build:

package:

BUILD FAILED
/usr/local/src/appname/build.xml:369: java.lang.UnsupportedClassVersionError: Bad version number in .class file
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:621)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:56)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
    at org.apache.tools.ant.util.depend.bcel.AncestorAnalyzer.<init>(AncestorAnalyzer.java:45)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:501)
    at java.lang.Class.newInstance0(Class.java:350)
    at java.lang.Class.newInstance(Class.java:303)
    at org.apache.tools.ant.taskdefs.optional.ejb.GenericDeploymentTool.createAnalyzer(GenericDeploymentTool.java:281)
    at org.apache.tools.ant.taskdefs.optional.ejb.GenericDeploymentTool.configure(GenericDeploymentTool.java:308)
    at org.apache.tools.ant.taskdefs.optional.ejb.EjbJar.execute(EjbJar.java:582)
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)
    at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:592)
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
    at org.apache.tools.ant.Task.perform(Task.java:348)
    at org.apache.tools.ant.Target.execute(Target.java:390)
    at org.apache.tools.ant.Target.performTasks(Target.java:411)
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1360)
    at org.apache.tools.ant.Project.executeTarget(Project.java:1329)
    at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
    at org.apache.tools.ant.Project.executeTargets(Project.java:1212)
    at org.apache.tools.ant.Main.runBuild(Main.java:801)
    at org.apache.tools.ant.Main.startAnt(Main.java:218)
    at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280)
    at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109)

Total time: 0 seconds

有没有办法找出在发生此异常时正在尝试加载哪个类文件?

我已尝试使用ant -vant -debug投放,但这并未添加有关此问题的任何有价值的信息。

正如所见,ant build完成没有错误(以及ant clean也可以。)

我理解我的设置中有些内容已被破坏,但了解有问题的类文件名对修复设置有很大帮助。

Ant和java / javac版本:

$ ant -version
Apache Ant version 1.8.0 compiled on March 11 2010

$ java -version
java version "1.5.0_22"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_22-b03)
Java HotSpot(TM) 64-Bit Server VM (build 1.5.0_22-b03, mixed mode)

$ javac -version
javac 1.5.0_22

操作系统版本:

$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 6.0.2 (squeeze)
Release:    6.0.2
Codename:   squeeze

JBoss已安装到/opt/jboss-4.2.3.GA

任何指针?

3 个答案:

答案 0 :(得分:0)

根据Javadocs的java.lang.UnsupportedClassVersionError,这个课程的重点是:

  

Java虚拟机时抛出   尝试读取类文件和   确定主要和次要   文件中的版本号不是   支撑。

这告诉我有一个类处于不受支持的版本(通常将其视为“更高版本”,而不是Ant目前使用的版本。

所以...说,并且看到你的Ant脚本看起来像是试图用EJB存根生成等做某事,让我想知道你正在尝试使用哪个版本的Java EE和你正在使用什么版本的JBoss。发现(就像EE 6不是Java SE 5)和JRE JBoss正在使用的东西。如果你使用的任何jar包的级别都高于1.5 build 22(即使它是1.5 build 23),那么你可能会遇到这个错误。确保你所有的罐子(甚至是第三方罐子和库以及你用来生成Java EE应用程序的那些)都是1.5 build 22或更低版本。这应该有助于缓解这个问题。如果您不确定jar的版本,可以使用Winzip“打开”它并查看其MANAFEST.MF文件。

答案 1 :(得分:0)

问题在于,ant是从Debian repo安装的,而其余的java包:如来自其他供应商的jdk,jre,jboss等(Sun / Oracle,Apache等)< / p>

我删除了Debian发布的ant并将其替换为Apache的最新二进制文件。这解决了我的问题。

答案 2 :(得分:0)

我遇到了同样的问题。 我发现解决方案是在蚂蚁脚本中。 在编译类的ant脚本中,我指定了build.target参数。 例如:

<target name="compile"><javac compiler="javac1.5" target="1.5" ....></target>