33

我尝试启动应用程序但使用Tomcat 7并且我遇到了这样的异常。

我认为这可能与Maven dependency,但我敢肯定。如果有人知道发生了什么请回答:)

例外:

message Servlet execution threw an exception

description The server encountered an internal error that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: Servlet execution threw an exception
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

root cause

java.lang.AbstractMethodError: javax.ws.rs.core.UriBuilder.uri(Ljava/lang/String;)Ljavax/ws/rs/core/UriBuilder;
    javax.ws.rs.core.UriBuilder.fromUri(UriBuilder.java:119)
    com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:651)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.50 logs.

Maven POM

<properties>
        <application.version>1.0</application.version>
        <spring.version>4.0.0.RELEASE</spring.version>
        <spring.security.version>3.2.0.RELEASE</spring.security.version>
        <jersey.version>1.18.1</jersey.version>
    </properties>



    <dependencies>
        <dependency>
            <groupId>climbing-portal-facade</groupId>
            <artifactId>climbing-portal-facade</artifactId>
            <version>${application.version}</version>
        </dependency>
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-core</artifactId>
            <version>${jersey.version}</version>
        </dependency>
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-server</artifactId>
            <version>${jersey.version}</version>
        </dependency>
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-json</artifactId>
            <version>${jersey.version}</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.test-framework.providers</groupId>
            <artifactId>jersey-test-framework-provider-jdk-http</artifactId>
            <version>2.7</version>
        </dependency>

        <!-- Jersey + Spring -->
        <dependency>
            <groupId>com.sun.jersey.contribs</groupId>
            <artifactId>jersey-spring</artifactId>
            <version>${jersey.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-core</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-web</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-beans</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-context</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-aop</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>
    </dependencies>

任何想法 ?

4

8 回答 8

51

您同时使用两者Jersey 1 & 2(Jersey 1 是显式依赖项,Jersey 2 是 的传递依赖项jersey-test-framework-provider-jdk-http),这是不可能的 - 所以classloader选择了错误的URIBuilder类。

中的Jersey依赖项group com.sun.jersey都是Jersey version 1. Jersey version 2使用组org.glassfish.jersey

您的Maven依赖项中都有导致此问题的两个。

如果可能,仅使用Jersey 2.

于 2014-04-29T21:03:38.540 回答
26

这也可能是由同时包含两者引起的

<dependency>
  <groupId>com.sun.jersey</groupId>
  <artifactId>jersey-server</artifactId>
  <version>1.xxx</version>
</dependency>

<dependency>
  <groupId>javax.ws.rs</groupId>
  <artifactId>javax.ws.rs-api</artifactId>
  <version>2.xx</version>
</dependency>

com.sun.jersey工件包括 javax.ws.rs 命名空间的版本 (1.0),因此它是唯一可能需要的。rs-api 还在同一命名空间中包含一个 JAX-RS (2.0) 版本,因此当您将两者放在一起时,但它们是不同的版本,可能会导致您看到的冲突。

这可能是由同时提供 JAX-RS 1.0 和 JAX-RS 2.0 的“任何”冲突引起的。JAX-RS 1.0 经常由com.sun.jersey:jersey*工件(特别是 jersey-core)提供,而 JAX-RS 2.0 由任何org.glassfish.jersey.core:jersey*工件或javax.ws.rs:javax.ws.rs-api工件或可能的javax:javaee-api工件或jsr311-api-1.0工件提供。

问题是,由于它们是不同的组+工件名称,默认情况下,maven 会在不知不觉中将1.0 和 2.0 版本的 jar 包含到您的最终发行版中。

使问题更加复杂的是,由于类路径中有多个冲突的 jar,“有时”它可能会工作,然后“有时”它可能不会(因此一些报告称“它与 tomcat7 一起工作,但与 tomcat8 一起失败”等)

使问题进一步复杂化的是,如果您甚至有一个依赖于传递依赖于上述任何内容的单一依赖项,那么 maven 将同时引入这两个版本并且您会被淹没。你可以找到来自哪里的东西mvn dependency:tree

所以你必须要么去“全 1.0”,要么“全 2.0”。在我们的例子中,我们通过向我们的 pom.xml 添加一些传递依赖排除项来使用所有 1.0。如果你想去所有 2.0 看这里

于 2014-11-05T21:29:38.793 回答
4

我解决了这个问题:我删除了 JAX-RS 2.0 库,添加了 jersey-server-1.8.jar、jersey-core-1.8.jar、jersey-servlet-1.12.jar 和 asm-3.3.1.jar 库

于 2015-03-20T17:29:21.553 回答
4

就我而言,jsr311-api-0.10.jar 和 javax.ws.rs-api-2.0.jar 都在应用程序库中。我删除了jsr311 jar,问题解决了

于 2017-02-01T04:48:06.813 回答
3

我有确切的问题找不到问题。Tomcat第一次启动并且一切正常,但是在重新启动服务器后我遇到了异常。

解决方案是将 tomcat 降级到 7.0.26 它确实成功了,但不知道为什么。

于 2015-01-14T09:31:26.480 回答
3

没想到,服务器的WEB-INF/lib文件夹下已经有一个名为javax.ws-rs-api-2.0.jar的文件了。它是两年前由其他人添加的。它与我复制到WEB-INF/lib文件夹的球衣文件集发生冲突。我备份/重命名了文件,重新启动了我的容器(即 Tomcat)的服务,它工作了。

于 2015-07-21T15:11:26.983 回答
2

我们需要进行以下更改:

web.xml

    <servlet>
      <servlet-name>RESTful Jersey Web Service Sample</servlet-name>
      <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>      
         <init-param>
                   <param-name>jersey.config.server.provider.packages</param-name>
                   <param-value>com.subu.jersey.rest</param-value>
         </init-param>
    </servlet>

pom.xml

    <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-server</artifactId>
        <version>2.17</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet-core</artifactId>
        <version>2.17</version>
    </dependency>
于 2017-06-07T08:39:40.537 回答
0

就我而言,jsr311-api-0.10.jar 和 javax.ws.rs-api-2.1.jar 都在应用程序库中。我删除了 javax.ws.rs-api-2.1.jar 并解决了问题

于 2020-07-28T08:39:10.910 回答