Apache Tomcat 8.0无法加载使用Eclipse for Java EE,Mars 2编写的Kotlin中的servlet类
我正在使用Eclipse for Java EE,Mars 2.我在这个IDE中首先使用Java 8和Apache Tomcat 8.0.x编写了一个servlet应用程序,运行得很好。
现在,我试图将代码移植到Kotlin。 但是,Apache Tomcat服务器,似乎从下面发布的信息,无法找到并加载我的类LoginServlet
。
我已经移植了helper类,并且只是一个名为LoginServlet
servlet类。 我删除了这个问题中的所有代码,只是为了展示一个简单的骨骼框架。
这是我的设置:
package bookyard.server; // import statements ommitted for brevity open class LoginServlet : HttpServlet() { override fun doGet(request : HttpServletRequest, response : HttpServletResponse) { val msg: String = "HTTP GET method not supported."; try { response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg); } catch (e: IOException) { e.printStackTrace(); } } override fun doPost(request : HttpServletRequest, response : HttpServletResponse) { this.doPostInternal(request, response); } private fun doPostInternal(request: HttpServletRequest, response: HttpServletResponse) { ... } }
我首先用@WebServlet("/login")
注释了LoginServlet
类,但是运行服务器就好了,但是给了我一个404的路径/登录名 ,甚至是ServletContext
路径http:// localhost:8080 / BookyardServer / 。
所以,我将servlet配置移到了WEB-INF\web.xml
文件中,现在看起来像这样:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>BookyardServer</display-name> <servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>bookyard.server.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> </web-app>
我的项目构建路径包括对我的代码使用的所有库的引用。 这里提供了一个快照。
在我的Project Facets和Targeted Runtimes中 ,我引用了Apache Tomcat 8.0运行时。
但是,当我调试为 – >在服务器上调试时 ,浏览器报告以下错误:
HTTP状态500 – 实例化servlet类bookyard.server.LoginServlet时出错
消息错误实例化servlet类bookyard.server.LoginServlet
描述服务器遇到一个内部错误,阻止它履行这个请求。
javax.servlet.ServletException 异常 :实例化servlet类时出错79)org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528)org.apache.coyote.http11.AbstractHttp11Processor.process( AbstractHttp11Processor.java:1099)org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:670)org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.doRun(NioEndpoint.java:1520)org.apache。 tomcat.util.net.NioEndpoint $ SocketProcessor.run(NioEndpoint.java:1476)java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)java.util.concurrent.ThreadPoolExecutor $ Worker.run(Unknown Source)org.apache。 tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java :61)java.lang.Thread.run(Unknown Source)
根本原因 java.lang.ClassNotFoundException:bookyard.server.LoginServlet org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1332)org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1166)org .apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java :616)org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528)org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1099)org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process (AbstractProtocol.java:670)org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.doRun(NioEndpoint.java:1520)org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.run(NioEndpoint.java:1476 )java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown 源)java.util.concurrent.ThreadPoolExecutor $ Worker.run(未知源)org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java:61)java.lang.Thread.run(Unknown Source)
我很确定这与%CLASSPATH%有关,但我不确定是什么。 我已经在类路径中设置了Apache Tomcat jar文件。 我的代码使用的其他一切也在类路径中。
我不知道为什么它不能加载我的servlet类。 能否请你帮忙?
================================================== ================
编辑2017/09/04:
你好朋友:
我找到一个解决方法。 也许它可以帮助你。
(1)创建一个Kotlin主类,例如:
fun main(args: Array<String>) { println("Hello, world!") }
(2)右键点击这个主类,选择“运行”=>“Kotlin Application”这将使Kotlin插件编译所有的Kotlin源文件,并生成类文件。
(3)将您的Web应用程序部署到应用程序服务器,但使用输出类文件夹而不是源文件夹。 例如,如果您的应用程序的“输出文件夹”是“var / classes”,则可以在WTP设置文件[.settings / org.eclipse.wst.common.component]中将其部署到App Server中, :
<wb-resource deploy-path="/WEB-INF/classes" source-path="/var/classes"/>
也可以从Eclipse的“Web部署程序集”对话框中设置: https : //eclipse.org/webtools/releases/3.2.0/NewAndNoteworthy/javaee.php
现在,Eclipse WTP插件会将“var / classes”文件夹部署到应用程序服务器,其中包括由Kotlin插件编译的所有类文件
================================================== ================
编辑在2016/11/17:
大家好,我为这个问题创建了一个问题:
https://youtrack.jetbrains.com/issue/KT-14838
================================================== ================
看起来你的kotlin类没有被分配给Tomcat服务器。
我有同样的问题,仍然在努力。
请阅读这篇文章: 不能将Kotlin类文件发布到Tomcat服务器
我终于解决了这个问题,通过在WTP设置文件.settings / org.eclipse.wst.common.component中添加以下设置:
<wb-resource deploy-path="/WEB-INF/classes" source-path="/kotlin_bin"/>
现在Kotlin类文件将被编译到虚拟文件夹/ kotlin_bin中 ,此文件夹中的类文件将被部署到Tomcat服务器中。
但是我认为Kotlin Eclipse插件应该为开发者处理这个问题
但是新的问题发生了 。
[/ kotlin_bin]文件夹中的类文件仅包含类和方法声明信息,但不会在这些类文件中生成实现代码。
所以,即使这些类文件被部署到Tomcat服务器,当我尝试启动Tomcat服务器,这些不完整的类文件将导致一个java.lang.ClassFormatError与以下错误信息:
在类文件xxxx / xxxx / xxxx中不是本机或抽象的方法中缺少代码属性
如果我从我的项目运行控制台应用程序,kotlin插件将编译源文件并生成类文件,然后我可以手动将这些类文件复制到Tomcat服务器。 但这是非常不方便的,因为我在开发过程中必须一遍又一遍地做。
- Kotlin无法在类中使用@Configuration @EnableWebMvc注释创建@Autowired字段
- 错误:执行失败的任务':app:kaptDemoTestingDebugKotlin'