我正在追逐一个神秘的问题,可以使用额外的一双眼睛..我一定是在遗漏一些东西!
我有一个使用源级别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)
我得到了相同的结果......
有没有人知道为什么我会收到此错误消息?
我不知道在哪里看,任何帮助或指示将不胜感激!
答案 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脚本的某处被检测到并覆盖环境变量。