2009-06-15 7 views
3

Quelle est la meilleure façon de déterminer quelle classe Java est compilé avec le numéro de version « mauvais »?qui .Class fichier a une version incorrecte

J'ai un projet avec un grand nombre de dépendances et quelque part j'ai une classe compilée en utilisant Java 1.6, où Java 1.5 est nécessaire. Lors de l'exécution, je reçois l'exception uninformative:

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

La seule chose que je place est le foo.Listener de la classe à laquelle toutes mes dépendances (Camel, ActiveMQ, diverses dans les bibliothèques de maison) sont nécessaires. La meilleure chose à laquelle j'ai pensé jusqu'ici est aussi d'utiliser opensnoop et de creuser manuellement les pots et les classes en utilisant les idées de "how-can-i-find-the-target-java-version-for-a-compiled-class". Y a-t-il un meilleur moyen?

+0

Il n'y a pas plus à la stacktrace que cela? –

Répondre

4

Vous pouvez essayer d'attacher un débogueur avec un point d'arrêt défini sur UnsupportedClassVersionError. (Exécuter -> Ajouter un point d'arrêt d'exception Java dans Eclipse)

Vous pouvez ensuite examiner le nom de classe transmis dans l'image defineClass ou loadClass lorsque le point d'arrêt arrête la machine virtuelle.

1

Essayez de lancer avec le drapeau verbose sur la ligne de commande.

0

Si vous voulez détecter tous les fichiers (dans un .jar ou un répertoire) qui ont une mauvaise version, vous pouvez charger chacun des fichiers via une bibliothèque de bytecode (BCEL ou ASM) et d'examiner leur numéro de version

0

En plus de ce que @gibbss dit, vous pouvez utiliser cette commande sur la ligne de commande.

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

Après cela, ouvrez le fichier sortie.txt avec un éditeur. Au début du fichier, il y aura des informations sur la version Java utilisée pour compiler cette classe. Les informations que vous devez rechercher est la « version majeure java ».
Utilisez les informations ci-dessous pour connaître la version java une fois que vous connaissez les informations majeures.

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