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
相关产品推荐
相关产品推荐

