2

Mac に bitnami Tomcat 7 インストール (apache + tomcat + mysql) があり、Java 1.7 76 を使用しています。私の Mac は Java 1.8 ランタイムを使用しています。プロジェクト (同じ Mac 上の intellij で作成) を tomcat にデプロイして実行しようとすると、UnsupportedClassVersionError が発生します。プロジェクトのコンパイルに使用する JDK のバージョンは問題ではなく (Apple 1.6、oracle 1.7、および oracle 1.8 バージョンを試しました)、設定した言語レベルも問題ではないようです。アプリを実行する唯一の方法は、言語レベル 1.3 を使用することです (1.8 の JDK 1.7 を使用)。

問題を解決するために、Tomcat を Mac にインストールされた 1.8 JDK で実行するように設定し、同じ JDK を使用するように intellij を構成しました。今、すべてが正常に動作します。

私の質問: Tomcat を実行する Java バージョンとまったく同じバージョンの JDK を使用して常にコンパイルする必要がありますか? それとも私は何か間違ったことをしていますか?

完全なエラー: (UnsupportedClassVersionError: マイナー バージョンも表示される場合があります)

HTTP Status 500 - javax.servlet.ServletException: java.lang.UnsupportedClassVersionError: test/TestClass

type Exception report

message javax.servlet.ServletException: java.lang.UnsupportedClassVersionError: test/TestClass

description The server encountered an internal error that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: javax.servlet.ServletException: java.lang.UnsupportedClassVersionError: test/TestClass
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:549)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:455)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause

javax.servlet.ServletException: java.lang.UnsupportedClassVersionError: test/TestClass
    org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:916)
    org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:845)
    org.apache.jsp.index_jsp._jspService(index_jsp.java:94)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause

java.lang.UnsupportedClassVersionError: test/TestClass
    org.apache.jsp.index_jsp._jspService(index_jsp.java:74)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.61 logs.
4

1 に答える 1

1

IDE または Tomcat のどちらから使用する場合でも、コンパイル時および実行時フェーズに 1 つのバージョンの JDK および JRE を使用することは、常に良い方法です。また、このような問題が発生しないように、テスト ケース (存在する場合) と tomcat の実行に使用したものと同じバージョンの JRE を使用してください。

私の質問: Tomcat を実行する Java バージョンとまったく同じバージョンの JDK を使用して常にコンパイルする必要がありますか?

コードを下位バージョンでコンパイルして上位バージョンで実行すると、この問題を回避できる場合がありますが、可能であればこの状況を回避する必要があります。そのため、コンパイルには IDE から同じ JDK バージョンを使用し、プロジェクトのデプロイには Tomcat から同じバージョンの JRE を使用してみてください。

于 2015-05-15T10:30:47.897 に答える