SearchServlet 已由 Java 运行时的更新版本编译

Posted

技术标签:

【中文标题】SearchServlet 已由 Java 运行时的更新版本编译【英文标题】:SearchServlet has been compiled by a more recent version of the Java Runtime 【发布时间】:2018-06-01 05:51:08 【问题描述】:

当我使用我的搜索功能时,我收到一个 http 状态 500 错误。它声称

错误报告

HTTP 状态 500 – 内部服务器错误

键入异常报告

Message SearchServlet 已由更新版本的 Java Runtime(类文件版本 53.0),这个版本的 Java 运行时只能识别最高 52.0 的类文件版本(无法加载 类 [SearchServlet])

描述 服务器遇到了一个意外情况 阻止它完成请求。

异常 java.lang.UnsupportedClassVersionError: SearchServlet 有 由更新版本的 Java 运行时编译(类文件 53.0 版),这个版本的 Java 运行时只识别类 文件版本高达 52.0(无法加载类 [SearchServlet]) org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2286) org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:811) org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1260) org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1119) org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:488) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803) org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790) org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459) org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) java.util.concurrent.ThreadPoolExecutor.runWorker(未知来源) java.util.concurrent.ThreadPoolExecutor$Worker.run(未知来源) org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) java.lang.Thread.run(未知来源)

我使用的是编译器合规级别 9。我有 JRE 1.8,我认为它是最新的。当我尝试使用 Eclipse Marketplace 安装 Java 9 时,它告诉我

http://download.eclipse.org/eclipse/updates/none.

我相信,鉴于所有这些,我完全是最新的,但我怎么不能在数据库中搜索记录?

<!DOCTYPE html>
<html>

<head>
  <meta charset="ISO-8859-1" <title>Add contact to Phone Book</title>
  <h1>Add contact to Phone Book</h1>
</head>

<body>
  <form name="submitInfo" method="get" action="AddEntryServlet" First Name: <input type="text" name="firstName" />
  <br/>
  <br/>
   Last Name: <input type="text" name="lastName" />
  <br/>
  <br/>
   Area Code: <input type="number" name="areaCode" />
  <br/>
  <br/>
   Phone Number: <input type="number" name="phoneNumber" />
  <br/>
  <br/>
  <input type="submit" value="Submit" />

  </form>
</body>
<h1>Search for Contact in Phone Book</h1>

<body>
  <form name="searchInfo" method="get" action="SearchServlet">
    Search First Name: <input type="text" name="searchFirstName" />
    <br/>
    <br/>

    <input type="submit" name="action" value="search" />

  </form>
</body>

</html> 

搜索 servlet 代码

import java.io.IOException; 
import java.io.PrintWriter; 
import java.util.List;

import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.hibernate.Query; import org.hibernate.Session;

import entities.Tbphonebook; import util.HibernateUtil;

/**  * Servlet implementation class SearchServlet  */
@SuppressWarnings("deprecation")
@WebServlet("/SearchServlet")
public class SearchServlet extends HttpServlet     private static final long
serialVersionUID = 1L;

/**
* @see HttpServlet#HttpServlet()
*/
public SearchServlet() 
super();
  // TODO Auto-generated constructor stub
  

/**      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)      */
@SuppressWarnings( "deprecation","unchecked" )
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    Session session = HibernateUtil.getSessionFactory().openSession();
    session.beginTransaction();
    String firstName = request.getParameter("searchFirstName");         
    @SuppressWarnings("rawtypes") 
    Query query = Session.createQuery("from Tbphonebook where firstname = ?");


List<Tbphonebook> persons = (List<Tbphonebook>) query.getResultList();



session.getTransaction().commit();      
session.close();



request.setAttribute("persons", persons);
request.getRequestDispatcher("searchResults.jsp").forward(request,response);
response.sendRedirect("searchResults.jsp");



结果jsp

%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=ISO-8859-1"> <title>Insert title here</title> </head>
<h1>Search Results</h1>
<h1>List Books:</h1>
<table class="table table-boardered table-striped" id="searchresults">      
    <tr>            
        <th>First Name</th>         
        <th>Last Name</th>
        <th>Area Code</th>          
        <th>PhoneNumber</th>
    </tr>       
</table>
<script>
        $(document).ready(function()
        $.getJSON("persons", function(data)
            var persons_data = '';
            $.each(data, function(key, value)
                person_date += '<tr>';
                person_data += '<td>'+value.Firstname+'</td>';
                person_data += '<td>'+value.Lastname+'</td>';
                person_data += '<td>'+value.Areacode+'</td>';
                person_data += '<td>'+value.Phonenumber+'</td>';
                person_date += '</tr>';
            
            );
        $('#searchresults').append(persons_data);
        );
    );
 </script>
<%
    String message = (String) request.getAttribute("message");
    if(!(message == null))
        out.println(message);
        else
            message= "";
            out.println(message);
        
%>

 </html>

【问题讨论】:

请花一些时间来格式化您的问题。你现在所拥有的几乎是不可读的。 看起来您正试图在早期版本的 Java 上运行使用更高版本的 Java 编译的东西,并且编译没有针对早期版本。有点像消息说的。所有其他信息都没有用(除了难以辨认,考虑代码格式化......好吧,代码。) 下次不要在每一行都放&gt;,而是将所有代码缩进4个空格。编辑器中甚至还有一个 按钮可以为您执行此操作。 非常确定你使用带有 java 8 JVM 的 Java 9 library 很抱歉最初的格式不正确。我相信这是 Java 编译的问题,我最终创建了一个新项目并复制了代码,一切正常。不是最好的解决方案,但它确实有效。 【参考方案1】:

“当我使用编译器时,我使用的是编译器合规级别 9。”版本 52.0 是 Java 8;我假设 53.0 是 Java 9。您试图在 Java 8 上运行为 Java 9 编译的代码,这会导致您遇到错误。将您的合规版本更改为 Java 8。

【讨论】:

【参考方案2】:

IDE:Eclipse 氧气。

要临时纠正问题,请执行以下操作:

Project menu > Properties > Java Compiler > Compiler compliance level > 1.8

永久修复可能涉及安装 JDK 9。

仅供参考 1.8 是 Java 8 的名称。

侧边栏

在涉足 C# 之后,我最近回到了 Java,并将 Eclipse Oxygen 安装到一个以前从未安装过 Java 的干净系统上。这个默认一切带有全新的 Eclipse Oxygen 安装,但不知何故或其他 Eclipse 无法获得自己的参数来匹配已安装的 jdk。这是我创建的第二个项目,也是我第二次遇到这种头疼的问题。

【讨论】:

同样适用于 Eclipse Photon【参考方案3】:

1) 如果您使用 maven 插件进行编译:尝试显式配置您的版本,例如:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.7.0</version>
    <configuration>
        <source>1.8</source>
        <target>1.8</target>
    </configuration>
</plugin>

2) 如果您使用自动化的类 UNIX 操作系统脚本进行编译,请尝试导出配置,例如:

export JAVA_HOME=`/usr/libexec/java_home -v 1.8`

3)如果你是用eclipse编译,试试指定JRE,例如:

Compiling to a specific JRE with Eclipse

4) 如果您使用 NetBeans 进行编译,请尝试指定 JRE,例如:

Netbeans - Build targetting JDK 6 but run using Java 7 JRE

【讨论】:

以上是关于SearchServlet 已由 Java 运行时的更新版本编译的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu执行jar文件[重复]

Gradle 构建失败并显示“org/eclipse/jgit/storage/file/FileRepositoryBuilder 已由 Java 的更新版本编译”

创建表时 ORA-00955: 名称已由现有对象使用

致命:错误 - 会话已由session.auto-start或session_start()启动

基于java+mysql+JDBC+tomcat+Servlet+JSP+js的学生管理系统

属性已由“FrameworkElement”注册