Estou configurando um servidor Tomcat para hospedar sites JSP. Criei um aplicativo de teste no Eclipse para ter certeza de que tudo está funcionando. Tudo o que ele faz é imprimir texto em JSP e depois chamar uma função em uma classe personalizada que também imprime texto. Isso funciona bem no Eclipse (rodando no mesmo computador que o Tomcat), colocado quando compilo o programa em um arquivo WAR e tento executá-lo no Tomcat, ele lança a exceção:
message javax.servlet.ServletException: java.lang.UnsupportedClassVersionError: jsp/test/TestClass : Unsupported major.minor version 51.0 (unable to load class jsp.test.TestClass)
description The server encountered an internal error that prevented it from fulfilling this request.
org.apache.jasper.JasperException: javax.servlet.ServletException: java.lang.UnsupportedClassVersionError: jsp/test/TestClass : Unsupported major.minor version 51.0 (unable to load class jsp.test.TestClass)
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:549)
...
root cause
javax.servlet.ServletException: java.lang.UnsupportedClassVersionError: jsp/test/TestClass : Unsupported major.minor version 51.0 (unable to load class jsp.test.TestClass)
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:912)
...
root cause
java.lang.UnsupportedClassVersionError: jsp/test/TestClass : Unsupported major.minor version 51.0 (unable to load class jsp.test.TestClass)
org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2899)
...
Devo salientar que, depois de atualizar a página, o erro muda para just UnsupportedClassVersionError
e perde o material "major.minor". Não tenho certeza do que está acontecendo lá.
O Google me disse que isso tem a ver com o tempo de execução ser uma versão mais antiga que o compilador, no entanto, até onde eu sei, tanto o Eclipse quanto o Tomcat estão usando o mais recente. Eles estão no mesmo computador, então deveriam estar usando a mesma variável JAVA_HOME, certo? Eu tenho várias instalações JRE/JDK diferentes e tentei várias delas como JAVA_HOME, embora nada parecesse mudar (estou reiniciando o Tomcat todas as vezes). A partir de agora é:
JAVA_HOME = C:\Program Files\Java\jdk1.7.0_25
Path = C:\Program Files\Java\jdk1.7.0_25\bin; ...
Há mais alguma coisa que precisa ser configurada para o Tomcat usar esta versão do Java? Ou há um local diferente para o qual preciso apontar JAVA_HOME? Eu tentei várias instalações do JRE também, mas não consegui nada. Alguma idéia com isso?
Tudo isso está sendo feito no Windows Server 2008 R2 usando o Tomcat 7.
Desde já, obrigado.
Douglas
Responder1
No Eclipse, vá para as Preferências do Projeto, vá para as configurações do Java Compiler.
O que énível de conformidade do compilador?
Se você estiver executando isso com o Tomcat 7 com Java 7, o nível de conformidade deverá ser definido como1.7. Se não for, esse pode ser o seu problema. Embora deva ficar bem, desde que seja <=1.7, você por acaso não teria configurado o Eclipse para um instantâneo do Java 8?
De qualquer forma, conhecer esse valor pode ajudar a esclarecer a questão.
Responder2
UnsupportedClassVersionError
sempre aparece quando você compila "com" uma versão (direcionando uma versão) e executa com uma versão Java anterior.
JAVA_HOME
não informa ao sistema operacional onde ele deve procurar o arquivo java.exe. O sistema operacional pegará esse arquivo da variável PATH. Por isso é recomendado adicionar no início da PATH
variável o path JAVA_HOME/bin
.
Se não for o caso, o stacktrace (o resto da mensagem de erro) pode ser útil. Em particular o "Major.minor não suportado" ou algo parecido, e os números.
Responder3
Como você está implantando seu código no Tomcat, via Eclipse (WTP) ou está construindo um WAR com uma ferramenta de construção específica e implantando-o manualmente em um Tomcat local?