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 FacetsTargeted 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服务器。 但这是非常不方便的,因为我在开发过程中必须一遍又一遍地做。