Apache Tomcat 8.0无法使用Eclipse for Java EE,Mars 2加载用Kotlin编写的servlet类

时间:2016-09-06 14:45:37

标签: eclipse apache tomcat servlets kotlin

我正在使用Eclipse for Java EE,Mars 2.我在这个IDE中首先使用Java 8和Apache Tomcat 8.0.x编写了一个servlet应用程序,运行得很好。

现在,我正在尝试将代码移植到Kotlin。但是,从下面发布的信息看,Apache Tomcat服务器无法找到并加载我的类LoginServlet

我已经移植了帮助程序类,只移植了一个名为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) {
        ...
    }
}

我首先使用LoginServlet注释注释了@WebServlet("/login")类但是运行服务器很好但是为路径 / login 提供了404,甚至为{ {1}}路径 http://localhost:8080/BookyardServer/

因此,我将servlet配置移动到ServletContext文件,它现在看起来像这样:

WEB-INF\web.xml

我的项目构建路径包括对我的代码使用的所有库的引用。这里提供了它的快照。

enter image description here

在我的项目方面目标运行时中,我引用了 Apache Tomcat 8.0 运行时。

enter image description here

enter image description here

然而,当我调试为 - >在服务器上调试,浏览器报告以下错误:

  

HTTP状态500 - 实例化servlet类bookyard.server.LoginServlet

时出错      

消息实例化servlet类bookyard.server.LoginServlet

时出错      

description 服务器遇到内部错误,无法完成此请求。

     

例外   javax.servlet.ServletException:实例化servlet类时出错   bookyard.server.LoginServlet     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(未知来源)     java.util.concurrent.ThreadPoolExecutor $ Worker.run(未知来源)     org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java:61)     java.lang.Thread.run(未知来源)

     

根本原因 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(未知来源)     java.util.concurrent.ThreadPoolExecutor $ Worker.run(未知来源)     org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java:61)     java.lang.Thread.run(未知来源)

我很确定这与%CLASSPATH%有关,但我不确定是什么。我在类路径中设置了 Apache Tomcat jar文件。我的代码使用的其他所有内容也都在类路径中。

我不确定为什么它无法加载我的servlet类。你能帮忙吗?

1 个答案:

答案 0 :(得分:1)

=============================================== ===================

2017/09/04编辑:

嗨朋友们:

我找到了解决方法。也许它可以帮助你。

(1)创建一个Kotlin主类,例如:

fun main(args: Array<String>) {
    println("Hello, world!")
}

(2)右键单击此主类,然后选择“运行”=&gt;“Kotlin应用程序” 这将使Kotlin插件编译所有Kotlin源文件,并生成类文件。

(3)将您的Web应用程序部署到App服务器,但使用outputed类文件夹而不是源文件夹。 例如,如果您的应用程序的“输出文件夹”是“var / classes”,您可以将其部署到App Server, 像这样,在WTP设置文件[.settings / org.eclipse.wst.common.component]中:

<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”文件夹部署到app Server,其中包括Kotlin插件编译的所有类文件

=============================================== ===================

2016/11/17编辑:

朋友们,我为这个问题创建了一个问题:

https://youtrack.jetbrains.com/issue/KT-14838

=============================================== ===================

看起来你的kotlin类没有代表Tomcat服务器。

我遇到同样的问题,并且还在努力。

请阅读这篇文章: Can not publish Kotlin class files to Tomcat server

我终于解决了这个问题, 将以下设置添加到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,并显示以下错误消息:

  

非本地或抽象的方法中的Absent Code属性   类文件xxxx / xxxx / xxxx

如果我从我的项目运行控制台应用程序,kotlin插件将编译源文件并生成类文件,然后我可以手动将这些类文件复制到Tomcat服务器。 但这非常不方便,因为我必须在我的开发过程中一遍又一遍地做。