Apache Tomcat 8.0 не может загрузить класс сервлета, написанный в Kotlin, используя Eclipse для Java EE, Mars 2

Я использую Eclipse для Java EE, Mars 2. Сначала я написал приложение сервлета, используя Java 8 и Apache Tomcat 8.0.x в этой среде разработки, и это работает отлично.

Теперь я пытаюсь передать код Котлину. Но сервер Apache Tomcat, похоже, из информации, размещенной ниже, не может найти и загрузить мой класс LoginServlet .

Я портировал вспомогательные классы и только один класс сервлета, который теперь называется LoginServlet . Я удаляю весь остальной код в этом вопросе только для того, чтобы представить скелет с голыми костями.

Вот моя настройка:

 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") но он отлично работал с сервером, но дал мне 404 для пути / входа и даже для пути ServletContext http: // localhost: 8080 / BookyardServer / ,

Итак, я переместил конфигурацию сервлета в 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> 

Мой проект « Путь сборки» содержит ссылки на все библиотеки, используемые моим кодом. Снимок сделан здесь.

введите описание изображения здесь

В моих гранях проекта и целевых Runtimes у меня есть ссылка на время выполнения Apache Tomcat 8.0 .

введите описание изображения здесь

введите описание изображения здесь

Однако, когда я отлаживаю As -> Debug on Server , браузер сообщает о следующей ошибке:

HTTP Status 500 – Ошибка создания экземпляра класса сервлета bookyard.server.LoginServlet

сообщение Ошибка создания экземпляра класса сервлета bookyard.server.LoginServlet

описание Сервер обнаружил внутреннюю ошибку, которая помешала ему выполнить этот запрос.

exception javax.servlet.ServletException: Ошибка создания экземпляра класса сервлета 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 (Неизвестный источник)

root cause 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%, но я не уверен, что. Я установил файлы jar Apache Tomcat в пути к классу. Все остальное, что использует мой код, также находится в пути к классу.

Я не уверен, почему он не может загрузить мой класс сервлета. Не могли бы вы помочь?

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

    EDIT в 2017/09/04:

    Привет, друзья:

    Я нашел обходное решение. Может быть, это может вам помочь.

    (1) Создайте основной класс Kotlin, например:

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

    (2) Щелкните правой кнопкой мыши этот основной класс и выберите «Запустить» => «Приложение Kotlin». Это сделает плагин Kotlin скомпилировать все исходные файлы Kotlin и сгенерировать файлы классов.

    (3) Разверните свое веб-приложение на сервере приложений, но используйте исходную папку классов вместо исходных папок. например, если «выходная папка» вашего приложения «var / classes», вы можете развернуть его на сервере приложений, как это, в файле настроек WTP [.settings / org.eclipse.wst.common.component] :

     <wb-resource deploy-path="/WEB-INF/classes" source-path="/var/classes"/> 

    также вы можете установить это из диалога «Создание веб-развертывания Eclipse»: https://eclipse.org/webtools/releases/3.2.0/NewAndNoteworthy/javaee.php

    Теперь плагин Eclipse WTP будет развертывать папку «var / classes» на сервере приложений, которая включает все файлы классов, скомпилированные плагином Kotlin

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

    EDIT в 2016/11/17:

    Привет друзья, я создал проблему для этой проблемы:

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

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

    Похоже, ваш класс kotlin не delpoyed на сервер 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 Server.

    Но я думаю, что плагин Kotlin Eclipse должен заботиться об этой проблеме для разработчиков

    Но возникла новая проблема .

    Файлы классов в папке [/ kotlin_bin] содержат только информацию об объявлении класса и метода, но код реализации не генерируется в этих файлах классов.

    Таким образом, даже эти файлы классов развертываются на сервере Tomcat. Когда я пытаюсь запустить Tomcat Server, эти неполные файлы классов вызовут java.lang.ClassFormatError со следующим сообщением об ошибке:

    Атрибут Absent Code в методе, который не является родным или абстрактным в файле класса xxxx / xxxx / xxxx

    Если я запустил консольное приложение из своего проекта, плагин kotlin будет компилировать исходные файлы и генерировать файлы классов, а затем я могу скопировать эти файлы классов на Tomcat Server вручную. Но это очень неудобно, потому что я должен делать это снова и снова в моем процессе разработки.