由于不支持的类版本异常,Tomcat 7无法加载类,但java版似乎是正确的(Ubuntu)

时间:2014-01-01 19:46:42

标签: java tomcat7 version ubuntu-12.04 java-7

我正在追逐一个神秘的问题,可以使用额外的一双眼睛..我一定是在遗漏一些东西!

我有一个使用源级别1.7构建的war应用程序。当我将它部署到在Ubuntu x64上运行的Tomcat 7时,我在日志中得到一个例外:

INFO: Deploying web application archive /var/lib/tomcat7/webapps/develop-status.war
Jan 1, 2014 11:14:08 AM org.apache.catalina.core.ContainerBase addChildInternal
SEVERE: ContainerBase.addChild: start: 
org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/develop-status]]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:895)
...
    at java.lang.Thread.run(Thread.java:701)
Caused by: java.lang.UnsupportedClassVersionError: com/specktro/orchid/deployment/monitor/DeploymentMonitorServletContextListener : Unsupported major.minor version 51.0 (unable to load class com.specktro.orchid.deployment.monitor.DeploymentMonitorServletContextListener)
    at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2840)
    at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1160)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1668)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1546)
    at org.apache.catalina.startup.WebAnnotationSet.loadClassAnnotation(WebAnnotationSet.java:144)
    at org.apache.catalina.startup.WebAnnotationSet.loadApplicationListenerAnnotations(WebAnnotationSet.java:73)
    at org.apache.catalina.startup.WebAnnotationSet.loadApplicationAnnotations(WebAnnotationSet.java:56)
    at org.apache.catalina.startup.ContextConfig.applicationAnnotationsConfig(ContextConfig.java:381)
    at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:858)
    at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:345)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5161)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    ... 37 more

我认为这非常简单:Tomcat必须运行的java版本低于用于编译战争的版本。

然后我检查用于编译的机器上的java版本,它与运行tomcat的机器上的版本完全匹配:

administrator@ci-server:~$ java  -version
java version "1.7.0_25"
OpenJDK Runtime Environment (IcedTea 2.3.10) (7u25-2.3.10-1ubuntu0.12.04.2)
OpenJDK 64-Bit Server VM (build 23.7-b01, mixed mode)

administrator@ci-server:~$ /etc/alternatives/java  -version
java version "1.7.0_25"
OpenJDK Runtime Environment (IcedTea 2.3.10) (7u25-2.3.10-1ubuntu0.12.04.2)
OpenJDK 64-Bit Server VM (build 23.7-b01, mixed mode)

administrator@ci-server:~$ javac  -version
javac 1.7.0_25

administrator@ci-server:~$ /etc/alternatives/javac  -version
javac 1.7.0_25

我还检查过Tomcat是用正确的java版本启动的:

administrator@test-websites:~$ /etc/alternatives/java -version

java version "1.7.0_25"
OpenJDK Runtime Environment (IcedTea 2.3.10) (7u25-2.3.10-1ubuntu0.12.04.2)
OpenJDK 64-Bit Server VM (build 23.7-b01, mixed mode)
administrator@test-websites:~$ /usr/share/tomcat7/catalina.sh version
bash: /usr/share/tomcat7/catalina.sh: No such file or directory
administrator@test-websites:~$ /usr/share/tomcat7/bin/catalina.sh version
Using CATALINA_BASE:   /usr/share/tomcat7
Using CATALINA_HOME:   /usr/share/tomcat7
Using CATALINA_TMPDIR: /usr/share/tomcat7/temp
Using JRE_HOME:        /usr/lib/jvm/java-7-openjdk-amd64
Using CLASSPATH:       /usr/share/tomcat7/bin/bootstrap.jar:/usr/share/tomcat7/bin/tomcat-juli.jar
Server version: Apache Tomcat/7.0.26
Server built:   Apr 1 2013 08:32:04
Server number:  7.0.26.0
OS Name:        Linux
OS Version:     3.8.0-34-generic
Architecture:   amd64
JVM Version:    1.7.0_25-b30
JVM Vendor:     Oracle Corporation

JAVA_HOME似乎设置正确:

administrator@ci-server:~$ echo $JAVA_HOME
/usr/lib/jvm/java-7-openjdk-amd64

更新 然后我将以下内容添加到catalina.sh

  echo "JAVA_HOME:"
  echo $JAVA_HOME
  echo "JRE_HOME:"
  echo $JRE_HOME
  echo "java -version"
  java -version

得到了正确的输出:

administrator@test-websites:~$ sudo /usr/share/tomcat7/bin/catalina.sh start
Using CATALINA_BASE:   /var/lib/tomcat7
Using CATALINA_HOME:   /usr/share/tomcat7
Using CATALINA_TMPDIR: /var/lib/tomcat7/temp
Using JRE_HOME:        /usr/lib/jvm/java-7-openjdk-amd64
Using CLASSPATH:       /usr/share/tomcat7/bin/bootstrap.jar:/usr/share/tomcat7/bin/tomcat-juli.jar
JAVA_HOME:
/usr/lib/jvm/java-7-openjdk-amd64
JRE_HOME:
/usr/lib/jvm/java-7-openjdk-amd64
java -version
java version "1.7.0_25"
OpenJDK Runtime Environment (IcedTea 2.3.10) (7u25-2.3.10-1ubuntu0.12.04.2)
OpenJDK 64-Bit Server VM (build 23.7-b01, mixed mode)

然后我尝试了Oracle的JDK 7而不是Open JDK。我在编译类的机器和运行tomcat的机器上安装了Oracle的Java 7:

java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)

我得到了相同的结果......

有没有人知道为什么我会收到此错误消息?

我不知道在哪里看,任何帮助或指示将不胜感激!

3 个答案:

答案 0 :(得分:3)

发现问题! 尽管在/ etc / environment中设置环境变量JAVA_HOME或导出它,但还必须更改/ etc / default / tomcat7文件以使用正确的JDK。

所以:

sudo sed -i -e 's|#JAVA_HOME=.*|JAVA_HOME="/usr/lib/jvm/java-7-oracle"|' /etc/default/tomcat7

这将取消注释该文件上的JAVA_HOME行并将其设置为Oracle的Java 7.如果您使用其他JDK,请更新该行以匹配您的行。

就是这样!现在tomcat可以很好地加载我的servlet。

感谢为此项研究做出贡献的所有人!

答案 1 :(得分:-1)

看起来你在你的ubuntu中使用了开放的JDK。尝试用Oracle JDK替换它。我遇到了很多Open JDK的问题。这里有link如何操作。

我不知道它会有所帮助,但至少你可以尝试一下。

答案 2 :(得分:-1)

在尝试使用Oracle JDK时,我偶然发现了这个问题。更改“default-java”的链接为我做了:

ln -s /usr/lib/jvm/<your jdk here> /usr/lib/jvm/default-java

我没有进一步调查,但我认为它会在shell脚本的某处被检测到并覆盖环境变量。