我正在尝试在JBoss jboss-eap-6.1 AS上运行一个简单的“Hallo World”应用程序Jersey 2.3.1 REST服务。在web.xml中我禁用了restEasy库。在部署期间,我收到错误:
JBWEB000289:Servlet com.sun.jersey.samples.helloworld.resources.MyApplication抛出load() exception:java.lang.NoSuchMethodError: javax.ws.rs.core.Application.getProperties()Ljava / util的/地图;
在POM中我放了这些依赖项:
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet-core</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.0</version>
</dependency>
这是我的web.xml,其中restEasy标记禁用:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>com.sun.jersey.samples.helloworld.resources.MyApplication</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.sun.jersey.samples.helloworld.resources.MyApplication</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<context-param>
<param-name>resteasy.scan</param-name>
<param-value>false</param-value>
</context-param>
<context-param>
<param-name>resteasy.scan.providers</param-name>
<param-value>false</param-value>
</context-param>
<context-param>
<param-name>resteasy.scan.resources</param-name>
<param-value>false</param-value>
</context-param>
<servlet-mapping>
<servlet-name>com.sun.jersey.samples.helloworld.resources.MyApplication</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
我的资源配置java类:
package com.sun.jersey.samples.helloworld.resources;
import org.glassfish.jersey.server.ResourceConfig;
public class MyApplication extends ResourceConfig {
public MyApplication() {
packages("com.sun.jersey.samples.helloworld.resources");
//super(HelloWorldResource.class);
}
}
有人有任何想法要解决它吗? 提前致谢, 罗伯特
答案 0 :(得分:47)
NoSuchMethodError
通常意味着您在类路径上有两个不同版本的类。由于javax.ws.rs.core.Application
类在其JAX-RS 2版本中确实具有getProperties()
方法,但在JAX-RS 1.x中没有,我猜想你会以某种方式组合旧的1.x泽西(或旧的REST api)与当前(2.3.1)之一。
你正在使用的程序包(com.sun.jersey
- '旧'Jersey程序包)指向这个方向(尽管只是将代码放入该程序包本身不会导致上述问题),你显然已经开始了将Jersey 1.x示例作为基础(泽西岛2中也有样本,请参阅Jersey GitHub上的helloworld-webapp)。
是否有可能,restEasy(也肯定包含javax.ws.rs.core.Application
类)没有完全关闭,并且某种方式默认为JAX-RS 1.x版本?
我首先检查你的pom文件,查看有效的pom(如果你的项目描述符有一些父项),并仔细检查你的类路径是什么 - 我相信有一个1.x版本的javax.ws.rs-api
某处。还尝试清理所有已编译的东西并从头开始重建。
说到依赖关系,如果你的列表是详尽的(关于Jersey),你很可能必须添加jersey-common
(2.3.1)依赖,就像在初始化期间已经ResourceConfig.packages()
方法调用一样PackageScanner
构造函数,其中包含对ReflectionHelper
的调用 - 这不再是服务器jar的一部分。
希望这有帮助。
答案 1 :(得分:18)
我最近遇到了同样的问题。我想为你分享我的步骤。正如其他答案所述,问题主要是因为在类路径上有两个不同版本的同一个类。所以当你在pom中添加maven依赖时要小心。
这类问题通常被称为 Jar Hell 。您可以使用 jhades API来调查这些类彼此重叠。这是我遵循的简单步骤。
将jhades依赖项添加到您的pom中。
<dependency>
<groupId>org.jhades</groupId>
<artifactId>jhades</artifactId>
<version>1.0.4</version>
</dependency>
显示报告
在new JHades().overlappingJarsReport();
方法中调用main
,它会输出到标准输出。
示例输出:
file:/Users/justin/.m2/repository/javax/ws/rs/jsr311-api/1.1.1/jsr311-api-1.1.1.jar overlaps with
file:/Users/justin/.m2/repository/javax/ws/rs/javax.ws.rs-api/2.0/javax.ws.rs-api-2.0.jar - total overlapping classes: 55 - same classloader ! This is an ERROR!
在您的pom中删除重叠maven依赖项之一。
此外,你可以使用另一种方法,如maven的dependency exclusions。
希望这会有所帮助:)
答案 2 :(得分:13)
刚开始使用JBoss EAP 6.1.1 - Jersey 2.3.1。
通常情况似乎不起作用/仅靠自己:
另外,您需要通过修改module.xml来完全禁用jax-rs 1.1 API的加载 jboss-eap-6.1 / modules / system / layers / base / javax / ws / rs / api / main / module.xml是这样的:
<module xmlns="urn:jboss:module:1.1" name="javax.ws.rs.api">
<resources>
<!-- Disable the next line -->
<!-- resource-root path="jboss-jaxrs-api_1.1_spec-1.0.1.Final-redhat-2.jar"/ -->
<!-- Insert resources here -->
</resources>
<dependencies>
<module name="org.jboss.resteasy.resteasy-jaxrs" services="export"/>
</dependencies>
</module>
请注意,这将禁用所有其他应用程序的JBoss(RestEasy)的jax-rs实现(以及在standalone / domain.xml中禁用jaxrs子系统)。
答案 3 :(得分:4)
这是泽西岛版本的冲突问题。我有同样的问题。以下是解决方法:
查看您的包依赖关系&#34; mvn依赖关系:tree&#34;
如果存在依赖于旧版Jersey版本的库依赖项,则可以在pom.xml中为该库的依赖关系标记添加排除部分
答案 4 :(得分:1)
使用mvn依赖:tree(感谢上面的建议)我能够确定罪魁祸首(在我的情况下)是:javax.ws.rs:jsr311 -api:1.1 删除此依赖项解决了我的问题。