java - 在 gradle 指南中构建 Java Web 应用程序会在打开 jsp 文件时引发许多错误
问题描述
我正在尝试使用 Java、eclipse 插件 Gradle 和 Gradle 的插件“war”和“gretty”开始使用 Web 应用程序(使用 gretty 的默认网络服务器 Jetty)
Web 服务器通常可以工作,但打开 jsp 文件会导致 500 错误。
我只尝试重建本教程:https ://guides.gradle.org/building-java-web-applications/
正如Gradle - Building Java Web Applications中所述,该指南不是最新的。因此,我尝试使用每个插件的最新版本,但以下错误并没有消失。
build.gradle 有以下内容:
plugins {
id 'war'
id 'org.gretty' version '2.3.1' //most current version according to gradle site
//https://plugins.gradle.org/plugin/org.akhikhl.gretty
//another version, but does not work neither
//id "org.akhikhl.gretty" version "2.0.0"
//from guides.gradle.org but outdated
//id 'org.gretty' version '2.2.0'
}
repositories {
// Use jcenter for resolving dependencies.
// You can declare any Maven/Ivy/file repository here.
jcenter()
}
dependencies {
//from guides.gradle.org, but outdated
//providedCompile 'javax.servlet:javax.servlet-api:3.1.0'
//current version
//https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api
providedCompile group: 'javax.servlet', name: 'javax.servlet-api', version: '4.0.1'
testCompile 'junit:junit:4.12'
}
我已经尝试了注释插件/依赖项的所有可能组合。
HelloServlet 的简化版:
package wtest;
import javax.servlet.annotation.*;
import javax.servlet.http.*;
import javax.servlet.ServletException;
import java.io.IOException;
@WebServlet(name = "HelloServlet", urlPatterns = {"hello"}, loadOnStartup = 1)
public class HelloServlet extends HttpServlet
{
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
if (request.getParameter("id") == null) {
response.getWriter().print("ID not specified"); //does work
return;
}
request.getRequestDispatcher("response.jsp").forward(request, response); //response.jsp throws errors
}
}
response.jsp 的内容
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Hello Page</title>
</head>
<body>
<h2>Hello, JSP!</h2>
</body>
</html>
我试图在 Windows 和 Mac 上设置它。一旦我使用了 gradle 不是最新的默认 gradle 包装器。还有一次我尝试使用更新的本地 gradle 发行版(5.5.1)。而且我使用的是 OpenJDK 12.0.2 - 而不是 Java EE 版本。
调用response.jsp时的错误:
HTTP ERROR 500
Problem accessing /wtest/hello. Reason:
Server Error
Caused by:
org.apache.jasper.JasperException: PWC6033: Error in Javac compilation for JSP
PWC6199: Generated servlet error:
source value 7 is obsolete and will be removed in a future release
PWC6199: Generated servlet error:
target value 7 is obsolete and will be removed in a future release
PWC6199: Generated servlet error:
To suppress warnings about obsolete options, use -Xlint:-options.
PWC6199: Generated servlet error:
package org.apache.jasper.runtime does not exist
PWC6199: Generated servlet error:
package org.apache.jasper.runtime does not exist
PWC6199: Generated servlet error:
cannot find symbol
symbol: class JspFactory
location: class org.apache.jsp.response_jsp
PWC6199: Generated servlet error:
package org.glassfish.jsp.api does not exist
PWC6199: Generated servlet error:
cannot find symbol
symbol: class HttpServletRequest
location: class org.apache.jsp.response_jsp
PWC6199: Generated servlet error:
cannot find symbol
symbol: class HttpServletResponse
location: class org.apache.jsp.response_jsp
PWC6199: Generated servlet error:
cannot find symbol
symbol: class ServletException
location: class org.apache.jsp.response_jsp
PWC6199: Generated servlet error:
package javax.servlet does not exist
PWC6199: Generated servlet error:
package javax.servlet.http does not exist
PWC6199: Generated servlet error:
package javax.servlet.jsp does not exist
PWC6199: Generated servlet error:
cannot find symbol
symbol: variable JspFactory
location: class org.apache.jsp.response_jsp
PWC6199: Generated servlet error:
cannot find symbol
symbol: class PageContext
location: class org.apache.jsp.response_jsp
PWC6199: Generated servlet error:
cannot find symbol
symbol: class HttpSession
location: class org.apache.jsp.response_jsp
PWC6199: Generated servlet error:
cannot find symbol
symbol: class ServletContext
location: class org.apache.jsp.response_jsp
PWC6199: Generated servlet error:
cannot find symbol
symbol: class ServletConfig
location: class org.apache.jsp.response_jsp
PWC6199: Generated servlet error:
cannot find symbol
symbol: class JspWriter
location: class org.apache.jsp.response_jsp
PWC6199: Generated servlet error:
cannot find symbol
symbol: class JspWriter
location: class org.apache.jsp.response_jsp
PWC6199: Generated servlet error:
cannot find symbol
symbol: class PageContext
location: class org.apache.jsp.response_jsp
PWC6199: Generated servlet error:
package org.glassfish.jsp.api does not exist
PWC6199: Generated servlet error:
cannot find symbol
symbol: class SkipPageException
location: class org.apache.jsp.response_jsp
PWC6199: Generated servlet error:
cannot find symbol
symbol: class ServletException
location: class org.apache.jsp.response_jsp
at org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:129)
at org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:299)
at org.apache.jasper.compiler.Compiler.generateClass(Compiler.java:392)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:453)
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:625)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:375)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:473)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:377)
at org.eclipse.jetty.jsp.JettyJspServlet.service(JettyJspServlet.java:103)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:812)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:587)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:595)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:191)
at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:72)
at wtest.HelloServlet.doGet(HelloServlet.java:18)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:812)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1669)
at org.eclipse.jetty.websocket.server.WebSocketUpgradeFilter.doFilter(WebSocketUpgradeFilter.java:201)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:585)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:577)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:215)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
at org.eclipse.jetty.server.Server.handle(Server.java:499)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:311)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:258)
at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:544)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555)
at java.base/java.lang.Thread.run(Thread.java:835)
我能做些什么来解决这个问题?我没有主意了。
先感谢您!
解决方案
我遇到了同样的问题,我很难解决它。因此,如果其他人将来会遇到此问题,请遵循以下步骤以使此示例正常工作:
- 在 HelloServlet 中,使用
urlPatterns = {"/hello"}
代替urlPatterns = {"hello"}
- 创建文件夹“main/webapp”
使用这个 build.gradle 文件:
plugins { id 'war' id "org.gretty" version "2.3.1" } gretty{ servletContainer = 'tomcat9' } repositories { jcenter() } dependencies { providedCompile 'javax.servlet:javax.servlet-api:4.0.1' testCompile 'junit:junit:4.12' } sourceCompatibility = 1.12 // You can probably specify another value targetCompatibility = 1.12 version = '1.0'
我用 Java 12 对其进行了测试。
推荐阅读
- python - Tensorflow:ImportError:DLL加载失败:找不到模块
- php - 第 3 行实体中 DomDocument 文档为空的原因
- javascript - 如何使用 nextjs 和 react hook 在我的页面页脚中显示网络生命体征指标?
- javascript - 如何使用两个下拉菜单抓取地图?
- xamarin - 适用于 Xamarin 的 OneSignal SDK:HandleNotificationReceived 未在华为设备上触发,但 HandleNotificationOpened 它是
- javascript - 使用 document.execCommand() 时如何防止触发 onInput 事件?
- python - 使用 python websocket 和 nginx 处理多个客户端
- node.js - 连接身份验证时出现 Mongoose 索引错误
- symfony - 与 DQL 查询的多对多关系
- f# - 在 F#、.Net Core 中,该项目不知道如何运行配置文件 IIS Express