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

Java Vaadin应用部署Jetty后无法找到JAX-WS端点问题咨询

排查Jetty下JAX-WS端点无法访问的问题

Jetty和GlassFish、WildFly的核心区别在于:它本身不自带完整的JAX-WS实现(GlassFish默认用Metro,WildFly用JBossWS),所以部署JAX-WS服务需要额外的配置和依赖支持。下面是一步步的排查方案:

1. 确认Jetty版本与JAX-WS依赖的兼容性

不同Jetty版本对应的JAX-WS集成方式略有差异:

  • 如果使用Jetty 9.x及以上,建议选择JAX-WS RI(Metro)或Apache CXF作为JAX-WS实现,需要在Maven中明确添加对应依赖。
  • 避免使用过时的javax.jws旧包,Jetty 11+建议使用Jakarta EE规范下的依赖(对应Jakarta EE 9+)。

2. 检查Maven依赖配置

以Metro为例,在pom.xml中添加必要的JAX-WS依赖:

<!-- JAX-WS API -->
<dependency>
    <groupId>javax.xml.ws</groupId>
    <artifactId>jaxws-api</artifactId>
    <version>2.3.1</version>
    <scope>provided</scope>
</dependency>
<!-- Metro JAX-WS Runtime -->
<dependency>
    <groupId>com.sun.xml.ws</groupId>
    <artifactId>jaxws-rt</artifactId>
    <version>2.3.3</version>
    <exclusions>
        <exclusion>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!-- Metro Servlet集成包 -->
<dependency>
    <groupId>com.sun.xml.ws</groupId>
    <artifactId>jaxws-servlet</artifactId>
    <version>2.3.3</version>
</dependency>

如果用Apache CXF,替换为CXF的Jetty集成依赖:

<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-frontend-jaxws</artifactId>
    <version>3.5.5</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-transports-http-jetty</artifactId>
    <version>3.5.5</version>
</dependency>

3. 配置Jetty的注解扫描(如果使用@WebService注解)

Jetty默认不会自动扫描JAX-WS的注解,需要在Maven Jetty插件中开启注解支持。在pom.xml的Jetty插件配置里添加:

<plugin>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-maven-plugin</artifactId>
    <version>9.4.50.v20221201</version>
    <configuration>
        <contextPath>/at</contextPath> <!-- 可匹配GlassFish的上下文路径,按需调整 -->
        <webApp>
            <contextXml>src/main/webapp/WEB-INF/jetty-context.xml</contextXml>
        </webApp>
        <scanIntervalSeconds>10</scanIntervalSeconds>
        <systemProperties>
            <systemProperty>
                <name>jetty.annotations.scanJar</name>
                <value>true</value>
            </systemProperty>
        </systemProperties>
    </configuration>
</plugin>

同时在jetty-context.xml中添加注解配置器:

<Configure class="org.eclipse.jetty.webapp.WebAppContext">
    <Call name="addConfiguration">
        <Arg>
            <New class="org.eclipse.jetty.annotations.AnnotationConfiguration"/>
        </Arg>
    </Call>
</Configure>

4. 验证应用上下文路径与端点URL

Jetty默认上下文路径是项目的artifactId(比如at-1.0),你也可以通过上面的<contextPath>配置修改。尝试访问以下URL(根据你的配置调整):

  • 上下文路径为/at时:http://localhost:8080/at/PrimaryTransmissionService?wsdl
  • 上下文路径为/at-1.0时:http://localhost:8080/at-1.0/PrimaryTransmissionService?wsdl

5. 查看Jetty的部署日志

启动Jetty时,仔细观察控制台日志,寻找关键信息:

  • 是否有JAX-WS端点部署成功的日志(比如Published endpoint)
  • 是否存在类加载错误、依赖缺失的报错(比如ClassNotFoundException)
  • 如果日志不够详细,开启调试日志:在Jetty插件的<systemProperties>中添加:
    <systemProperty>
        <name>org.eclipse.jetty.level</name>
        <value>DEBUG</value>
    </systemProperty>
    <systemProperty>
        <name>com.sun.xml.ws.level</name>
        <value>DEBUG</value>
    </systemProperty>
    

6. 手动注册JAX-WS端点(自动扫描失效时)

如果注解扫描还是不生效,可以通过代码或web.xml手动注册端点:

方式1:ServletContextListener手动注册

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.xml.ws.Endpoint;

@WebListener
public class WSEndpointRegistrar implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        // 替换为你的服务实现类
        PrimaryTransmissionServiceImpl service = new PrimaryTransmissionServiceImpl();
        // 端点路径,对应上下文路径后的部分
        Endpoint.publish("/PrimaryTransmissionService", service);
    }
}

方式2:web.xml配置Servlet

<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">
    <servlet>
        <servlet-name>PrimaryTransmissionService</servlet-name>
        <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>PrimaryTransmissionService</servlet-name>
        <url-pattern>/PrimaryTransmissionService</url-pattern>
    </servlet-mapping>
    <context-param>
        <param-name>com.sun.xml.ws.config.file</param-name>
        <param-value>/WEB-INF/jaxws-endpoint-config.xml</param-value>
    </context-param>
</web-app>

对应的jaxws-endpoint-config.xml放在WEB-INF下:

<endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0">
    <endpoint
        name="PrimaryTransmissionService"
        implementation="com.yourpackage.PrimaryTransmissionServiceImpl"
        url-pattern="/PrimaryTransmissionService"/>
</endpoints>

先从依赖和注解扫描这两步入手,大部分Jetty下的JAX-WS问题都是因为这两个环节缺失导致的。如果还是不行,把Jetty的报错日志贴出来,能更精准定位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:17:25