You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Eclipse Jetty 9与Apache Tomcat 9同类路径冲突问题求助

解决方案:Jetty与Tomcat共存类路径下的"Not running on Jetty, JSR-356 support unavailable"错误

问题根源

Jetty 9的org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer实现了Servlet 3.0的ServletContainerInitializer接口,Tomcat启动时会自动扫描并执行所有实现该接口的类。该类的onStartup方法会强制校验当前运行环境是否为Jetty,若检测到是Tomcat则抛出异常。

可行解决方案

1. 禁用Servlet容器的注解扫描(简单但有副作用)

在项目的web.xml中设置metadata-complete="true",阻止Tomcat扫描所有ServletContainerInitializer和注解驱动的组件:

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0"
         metadata-complete="true">
    <!-- 其他web.xml配置 -->
</web-app>

注意:此方法会禁用所有Servlet 3.0+的注解支持(如@WebServlet、@WebFilter等),如果项目依赖这些注解则慎用。

2. 配置Tomcat排除Jetty相关JAR的可插拔性扫描

通过Tomcat的context.xml配置,指定Jar扫描过滤器,跳过包含Jetty WebSocket初始化类的JAR包:

<Context>
    <JarScanner>
        <JarScanFilter 
            defaultPluggabilityScan="true"
            pluggabilityExcludes="org.eclipse.jetty.websocket.javax-websocket-server-impl-*.jar"/>
    </JarScanner>
</Context>

如果是嵌入式Tomcat,可通过代码配置过滤器:

Tomcat tomcat = new Tomcat();
Context webContext = tomcat.addWebapp("/", new File("src/main/webapp").getAbsolutePath());

// 配置Jar扫描过滤器排除Jetty WebSocket相关JAR
JarScanner jarScanner = webContext.getJarScanner();
jarScanner.setJarScanFilter(new JarScanFilter() {
    @Override
    public boolean check(String jarName, JarScanType scanType) {
        if (JarScanType.PLUGGABILITY.equals(scanType) && jarName.contains("jetty-websocket")) {
            return false; // 跳过Jetty WebSocket相关JAR的可插拔性扫描
        }
        return true;
    }
});

3. 依赖层面隔离Jetty与Tomcat的WebSocket组件

如果使用构建工具(Maven/Gradle),可以为Jetty和Tomcat的使用场景配置不同的依赖范围,避免在Tomcat环境下加载Jetty的WebSocket JSR356实现:

  • Maven示例:将Jetty的WebSocket服务器依赖标记为仅在特定profile中引入:
<profiles>
    <profile>
        <id>jetty-environment</id>
        <dependencies>
            <dependency>
                <groupId>org.eclipse.jetty.websocket</groupId>
                <artifactId>javax-websocket-server-impl</artifactId>
                <version>9.4.50.v20221201</version>
                <scope>compile</scope>
            </dependency>
        </dependencies>
    </profile>
    <profile>
        <id>tomcat-environment</id>
        <dependencies>
            <!-- Tomcat环境下不引入Jetty的WebSocket服务器实现 -->
        </dependencies>
    </profile>
</profiles>

内容的提问来源于stack exchange,提问作者HeXMaN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 17:45:47