2009-06-15 9 views
3

どのJavaクラスが「間違った」バージョン番号でコンパイルされているかを判別する最も簡単な方法は何ですか?不正なバージョンの.classファイルを見つける

私は、Java 1.5が必要なJava 1.6を使用してコンパイルされたクラスをいくつか持っています。実行時に私は情報価値がない例外を取得:

 
[WARN] StandardWrapperValve[shell]: Servlet.service() for servlet shell threw exception 
java.lang.UnsupportedClassVersionError: Bad version number in .class file 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:675) 
    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:316) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:280) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:251) 
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:374) 
    at foo.Listener.(Listener.java:30) 
    at foo.rpc.service.MapServiceImpl.(MapServiceImpl.java:58) 
    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:494) 
    at java.lang.Class.newInstance0(Class.java:350) 
    at java.lang.Class.newInstance(Class.java:303) 
    at com.google.gwt.dev.shell.GWTShellServlet.tryGetOrLoadServlet(GWTShellServlet.java:934) 
    at com.google.gwt.dev.shell.GWTShellServlet.service(GWTShellServlet.java:276) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214) 
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) 
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) 
    at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152) 
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) 
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137) 
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118) 
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102) 
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) 
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) 
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929) 
    at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705) 
    at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577) 
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683) 
    at java.lang.Thread.run(Thread.java:613) 

私はスポット唯一のことは、(家のライブラリ内の様々なキャメル、ActiveMQの、)私のすべての依存関係が必要とされるクラスfoo.Listenerです。

これまでに考えたことの中で一番良いことは、opensnoopを使って、"how-can-i-find-the-target-java-version-for-a-compiled-class"のアイデアを使ってjarsとクラスを手動で調べることです。より良い方法がありますか?

+0

これ以上のスタックトレースはありませんか? –

答えて

4

UnsupportedClassVersionErrorにブレークポイントを設定してデバッガをアタッチしてみてください。 (実行 - > EclipseでJava例外ブレークポイントを追加する)

ブレークポイントがVMを停止するときに、defineClassまたはloadClassフレームに渡されるクラス名を調べることができます。

1

コマンドラインで-verboseフラグを付けて実行してみてください。

0

あなたはそれらのバージョン番号あなたはバイトコードライブラリ(BCELまたはASM)を介しての各ファイルを読み込むことができます悪いバージョンを持っている(.jarまたはディレクトリ内)のすべてのファイルを検出し、調べたい場合は

0

@gibbssに加えて、コマンドラインでこのコマンドを使用できます。この後

javap -v path-to-your-class-file > output.txt

、任意のエディタでoutput.txtとファイルを開きます。ファイルの先頭には、このクラスをコンパイルするために使用されるJavaバージョンに関する情報があります。あなたが探している情報は "java メジャーバージョン"です。
メジャー情報を知った後、以下の情報を使用してJavaバージョンを確認してください。

Java 1.2 uses major version 46 
Java 1.3 uses major version 47 
Java 1.4 uses major version 48 
Java 5 uses major version 49 
Java 6 uses major version 50 
Java 7 uses major version 51 
Java 8 uses major version 52 
関連する問題