运行码头时出现错误 NoClassDefFoundError

Posted

技术标签:

【中文标题】运行码头时出现错误 NoClassDefFoundError【英文标题】:Error NoClassDefFoundError when run jetty 【发布时间】:2020-02-21 22:34:58 【问题描述】:

我尝试在 jar 可执行文件中创建一个码头服务器 我有 maven 3.6.0 和 OpenJdk 11.0.4

我的第一次运行失败当我启动我的代码时收到以下错误:

线程“main”中的异常 java.lang.NoClassDefFoundError: javax/servlet/http/HttpServletResponse 在 com.my.test.Main.main(Main.java:13) 引起:java.lang.ClassNotFoundException:javax.servlet.http.HttpServletResponse 在 java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583) 在 java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) 在 java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ... 1 更多

代码:

import java.net.URL;
import java.security.ProtectionDomain;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.webapp.WebAppContext;

public class Main 

    public static void main(String[] args) throws Exception 
        int port = Integer.parseInt(System.getProperty("port", "8080"));
        Server server = new Server(port);

        ProtectionDomain domain = Main.class.getProtectionDomain();
        URL location = domain.getCodeSource().getLocation();

        WebAppContext webapp = new WebAppContext();
        webapp.setContextPath("/");
        webapp.setDescriptor(location.toExternalForm() + "/WEB-INF/web.xml");
        webapp.setServer(server);
        webapp.setWar(location.toExternalForm());

        server.setHandler(webapp);
        server.start();
        server.join();
    

pom.xml 依赖:

    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.el</groupId>
            <artifactId>javax.el-api</artifactId>
            <version>3.0.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-server</artifactId>
            <version>9.4.22.v20191022</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-util</artifactId>
            <version>9.4.22.v20191022</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-servlet</artifactId>
            <version>9.4.22.v20191022</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-plus</artifactId>
            <version>9.4.22.v20191022</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-webapp</artifactId>
            <version>$version.jetty</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>apache-jsp</artifactId>
            <version>$version.jetty</version>
        </dependency>
    </dependencies>
</project>

我不明白发生了什么,有人可以帮忙吗?

提前谢谢你。

【问题讨论】:

检查这个问题:***.com/questions/31295771/… 谢谢你,但它没有用,我总是有同样的例外,无论我做什么。 缺少的类 HttpServletResponse 位于 servlet-api 中。您是否尝试将其作为正常依赖项,并提供not?然后检查它是否最终在你的罐子里。 【参考方案1】:

如果你在做嵌入式码头,那么服务器上的任何依赖项都不会被标记为...

<scope>provided</scope>

服务器永远不会在自身之外“提供”依赖项。

提供的依赖项是典型的war打包项目,表明服务器将在运行时为它们提供特定的依赖项。

【讨论】:

以上是关于运行码头时出现错误 NoClassDefFoundError的主要内容,如果未能解决你的问题,请参考以下文章

在 android 2.3 上使用 jcifs 库时出现 NoClassDefFound 异常

尝试使用 jsr 356 时出现 java.lang.linkage 错误

XStream noClassDefFound 错误取决于运行时

在运行SQL时出现错误,请问如何解决?

运行 Docker 映像时无法访问 jarfile

运行查询以创建表时出现错误 1064?