【发布时间】:2016-01-10 02:44:57
【问题描述】:
我正在使用 Jersey 创建一个 REST API。在我的本地机器上,我使用 maven 运行 Apache Tomcat 8。当我在本地机器上运行 eclipse 时,它工作正常。但是,当我尝试在远程服务器上通过 Jenkins 构建时(我将更改推送到远程服务器并让它在那里构建),我收到以下错误
java.lang.NoSuchMethodError: javax.ws.rs.core.Application.getProperties()Ljava/util/Map;
org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:331)
org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:390)
org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:172)
org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:364)
javax.servlet.GenericServlet.init(GenericServlet.java:158)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:521)
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1096)
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:674)
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456)
java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.lang.Thread.run(Unknown Source)
这是我的 pom.xml
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.glassfish.jersey</groupId>
<artifactId>jersey-bom</artifactId>
<version>${jersey.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-moxy</artifactId>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet-core</artifactId>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>1.19</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.6.3</version>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.19</version>
</dependency>
</dependencies>
<properties>
<jersey.version>2.22.1</jersey.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
我在网上搜索过,它说这与 Jerser v1 和 v2 相互冲突有关。我的本地机器和远程机器具有相同的源代码、相同的 JDK,但是在部署时,远程机器在命中端点时会抛出该错误。可能会出什么问题
【问题讨论】:
-
此错误意味着代码是针对具有此方法的 Jersey 版本编译的,但是您尝试使用过时的 Jersey 版本运行它。查看远程机器上的 Tomcat 目录 - 是否有一个流氓 jar 隐藏在某个地方?
-
另外,我刚刚注意到您没有为您的两个依赖项指定版本。我什至不确定您的项目是如何编译的 - 我认为这会导致 Maven 错误。
-
@MikeBaranczak 项目正在编译,因为 OP 正在使用
<scope>import</scope>导入jersey-bom。版本在那里定义。但是看来 OP 正在重新定义jersey-client版本,所以这里肯定有问题。 -
泽西客户端是 1.X 而其余的是 2.X?我认为这行不通……这是导致问题的原因。