当前位置: 首页 > 知识库问答 >
问题:

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

司健柏
2023-03-14

我使用Eclipse for Java EE,Mars 2。我首先在这个IDE中使用Java8和Apache Tomcat8.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类,但是这个注释运行服务器很好,但是对于路径/login,甚至对于servletcontext路径http://localhost:8080/bookyardserver/给出了404。

因此,我将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>

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

在我的项目方面和目标运行时中,我引用了Apache Tomcat8.0运行时。

但是,当我在服务器上调试为->Debug时,浏览器会报告以下错误:

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

异常javax.servlet.servletException:实例化servlet类bookyard.server.loginServlet)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(.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 catalina.connector.coyoteAdapter.service(CoyoteAdapter.java:528)org.apache.coyote.http11.abstractHttp11Processor.process(abstractHttp11Processor.java:1099)org.apache.coyotp11Processor.java:1099)org.apache.coyote.abstractConnectionHandler.process(abstractProtocol.java:670)org.apache.tomcat.util.net.nioEndpoint$socketPro源代码)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个答案

万嘉石
2023-03-14

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

编辑日期为2017/09/04:

朋友们好:

我找到了一个变通办法。也许能帮到你。

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

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

(2)右键单击主类,选择“Run”=>“Kotlin Application”,这将使Kotlin插件编译所有的Kotlin源文件,并生成类文件。

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

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

2016/11/17编辑:

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

请阅读这篇文章:无法将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_bin]文件夹中的类文件只包含类和方法声明信息,但在这些类文件中不生成实现代码。

因此,即使这些类文件部署到Tomcat服务器中,当我试图启动Tomcat服务器时,这些不完整的类文件将导致java.lang.ClassFormatError出现以下错误消息

类文件xxxx/xxxx/xxxx中不是本机或抽象的方法中缺少代码属性

 类似资料:
  • 我正试图用PhpUnit和Composer。为此,我做了: 1添加phpUnit到req作曲家部分: 2.根据需要安装: php编写器。phar安装--dev 手术成功结束。 安装phpunit/phpunit(3.7.6)下载:100% 不幸的是,当我想做测试时,我得到了 ./vendor/bin/phpunit PHP致命错误:对/home/serek/PHP/project/tests/bo

  • 我有一个gradle 4.1多项目,其中包含一个包含2个子文件夹“api”和“实现”的“项目A”。 多项目使用在主build.gradle的子项目部分中定义的< code>kotlin和< code>java-library插件。实现项目具有对< code>:projectA:api的API依赖性 在api文件夹中,我在“src/main/java”中有kotlin和java文件,在实现项目中,我

  • 我想用cdn的axios 但是我得到了一个错误:拒绝加载脚本的https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js'因为它违反了以下内容安全策略指令:“script src'self'”。请注意,未显式设置“script src elem”,因此将“script src”用作回退。

  • 我试图在点击事件上使用ajax调用servlet。从那个servlet,我称之为谷歌身份验证endpoint。我尝试将标头设置为我正在调用的servlet,但我无法摆脱此错误 XMLHttpRequest 无法加载 https://accounts.google.com/o/oauth2/auth?client_id=2536-a...nid 个人资料电子邮件 这是代码 在servlet上,我将其

  • 我需要计算所有点的菜的总价,但我没有写减价法。这是一个方法签名(参数有一个Dish的映射,以及它被订购了多少次)。 所以它一定是每道菜的总和。getPrice*DishQuantity 有人问我的失败代码

  • 问题内容: 我正在尝试从“远程”网站获取一些json数据。我在99000端口上运行Web服务,然后在99001端口上启动网站(http:// localhost:99001 / index.html)。 我收到以下消息: 即使以HTML文件启动网页,我也会得到以下信息: Web服务返回数据。我尝试捕获这样的数据项: 我正在尝试获得以下结构: 您知道我为什么会收到此错误吗? 问题答案: 您无法执行X