我正在尝试在 IDEA 中构建一个 HelloWorld servlet 并通过 Tomcat 运行它。
结果,我得到一个 *.war 文件,我把它扔到 Tomkat 文件夹中,然后转到http://localhost:8080/scp-ru-1/
我只得到index.html文件中的内容。如何得到servlet类中应该输出什么的输出?
服务小程序类:
class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException {
response.getOutputStream().write("Test test".getBytes());
}
}
网站.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>ru.test.scpweb.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/MyServlet</url-pattern>
</servlet-mapping>
</web-app>
构建.gradle
//gretty plugin
apply plugin: 'war'
apply from: 'https://raw.github.com/akhikhl/gretty/master/pluginScripts/gretty.plugin'
group 'scpweb'
version '1'
repositories {
mavenCentral()
}
dependencies {
compile 'javax.servlet:javax.servlet-api:3.1.0'
}
也许班级有问题,因为 当你试图去它http://localhost:8080/scp-ru-1/MyServlet给
HTTP Status 500 - Error instantiating servlet class ru.test.scpweb.MyServlet
type Exception report
message Error instantiating servlet class ru.test.scpweb.MyServlet
description The server encountered an internal error that prevented it from fulfilling this request.
exception
javax.servlet.ServletException: Error instantiating servlet class ru.test.scpweb.MyServlet
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:502)
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1104)
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684)
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1519)
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1475)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.lang.Thread.run(Thread.java:745)
root cause
java.lang.IllegalAccessException: Class org.apache.catalina.core.DefaultInstanceManager can not access a member of class ru.test.scpweb.MyServlet with modifiers ""
sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102)
java.lang.Class.newInstance(Class.java:436)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:502)
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1104)
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684)
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1519)
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1475)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.lang.Thread.run(Thread.java:745)
还有一个大问题是,之后只能在几分钟内refresh all gradle projects完成。assemble在那之后,直到下 一个,它给出了refresh all gradle projects所有任务启动的错误gradle
18:42:37: Executing external task 'assemble'...
CreateProcess error=2, Не удается найти указанный файл
18:42:37: External task execution finished 'assemble'.
不确定,但以下消息似乎揭示了详细信息(尝试时的消息选项卡build)
Error:Cannot run program "C:\DEV\IDEA\jre\bin\java" (in directory "C:\Users\mohax\.IdeaIC2016.3\system\compile-server"): CreateProcess error=2, Не удается найти указанный файл
更新:
主要问题是类访问修饰符。我有一批,但我必须有一个公共的,即 public class MyServlet.
问题gradle是 Java 的路径在 IDEA 中飞走了。我又把它放下了——组装的问题消失了。
前半部分问题的答案:需要用public修饰符声明MyServlet类。上述错误消息中的第二个堆栈跟踪(根本原因)表明了这一点。
不幸的是,关于 Gradle,我不能说什么,它是从 Windows 上的 IDEA 启动的。除非,从命令行尝试Gradle,以切断由于IDEA中的配置而导致的问题。这在任何情况下都对后续的持续交付有用。
UPD:关于 Gradle,所以它不再相关。但是在开发的时候,我总是尽量在没有IDE参与的情况下,先实现汇编,然后再进行配置。这同样适用于 Maven、Sbt、npm 和其他构建器。