gpt4 book ai didi

java - IntelliJ 中出现 NoSuchMethodError,但 Eclipse 中没有

转载 作者:行者123 更新时间:2023-11-30 08:14:16 24 4
gpt4 key购买 nike

我正在尝试使用 Jetty 服务器运行 Jersey REST 服务。当我在 IntelliJ 中运行时,出现以下错误:

java.lang.NoSuchMethodError: javax.ws.rs.core.Application.getProperties()Ljava/util/Map;
at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:309)
at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:338)
at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:171)
at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:363)
at javax.servlet.GenericServlet.init(GenericServlet.java:244)
etc...
at service.WebserviceRunner.start(WebserviceRunner.java:37)

如果我在 Eclipse 中运行相同的项目,它运行得很好。为什么 IDE 会有所作为?

<小时/>

WebserviceRunner.java

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.HandlerCollection;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.webapp.WebAppContext;
import org.glassfish.jersey.server.ServerProperties;
import org.glassfish.jersey.servlet.ServletContainer;

public class WebserviceRunner {

private Server server;
private int port;
private String host;

public WebserviceRunner(String host, int port) {
this.server = new Server(port);
this.host = host;
this.port = port;
}

public void start() throws Exception {
HandlerCollection handlers = new HandlerCollection();
WebAppContext handler = new WebAppContext();

handler.setContextPath("/");
handler.setResourceBase("./");
handler.setClassLoader(Thread.currentThread().getContextClassLoader());

ServletHolder restServlet = handler.addServlet(ServletContainer.class, "/*");
restServlet.setInitOrder(0);
restServlet.setInitParameter(ServerProperties.PROVIDER_PACKAGES,"resource");

handlers.addHandler(handler);

server.setHandler(handlers);
server.start();
System.out.println("API started... at 'http://" + getHostAndPort() + "'");
}

private String getHostAndPort() {
return host + ":" + port;
}

public static void main(String[] args) throws Exception {
new WebserviceRunner("localhost", 8315).start();
}
}

build.gradle

apply plugin: 'java'
apply plugin: 'jetty'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'war'

repositories {
mavenCentral()
}

dependencies {
compile 'org.glassfish.jersey.core:jersey-server:2.17'
compile 'org.glassfish.jersey.containers:jersey-container-servlet-core:2.17'

compile 'org.javassist:javassist:3.15.0-GA'
compile 'javax.ws.rs:javax.ws.rs-api:2.0.1'
compile 'javax.inject:javax.inject:1'
compile 'com.google.code.gson:gson:2.2.2'
compile 'com.google.guava:guava:10.0'
compile 'com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:2.3.0'
testCompile group: 'junit', name: 'junit', version: '4.11'

def jettyVersion = '7.2.2.v20101205';
compile "org.eclipse.jetty:jetty-server:${jettyVersion}"
compile "org.eclipse.jetty:jetty-webapp:${jettyVersion}"
compile "org.eclipse.jetty:jetty-servlet:${jettyVersion}"
compile "org.eclipse.jetty:jetty-servlets:${jettyVersion}"
compile "org.eclipse.jetty:jetty-annotations:${jettyVersion}"
compile 'org.mortbay.jetty:jsp-2.1-glassfish:2.1.v20100127'
compile 'javax.servlet:jstl:1.2'
compile 'javax.servlet:javax.servlet-api:3.0.1'
}
<小时/>

注意:我认为这与我的类路径上有同一应用程序类的两个不同版本有关。当我只导入一个时,为什么会出现这种情况?

enter image description here

最佳答案

我昨天遇到了这个问题,使用的是 Maven,而不是 Gradle。你是对的,问题是由于同一个包中有两个具有相同类名的 jar:java.ws.rs.core.Application。

我能够通过搜索依赖关系树并找到哪个 jar 的依赖关系引入了应用程序的 Jersey 版本并使用 Maven 的排除标记将其排除来修复它。

在您的情况下,这是非常明显的:类加载器看到 java.ws.rs.core.Application 的两个版本,并从 org.glassfish.jersey.core 中选择一个不是您想要的版本。

至于为什么它在Eclipse中工作而不是在IDEA中工作,类加载器不保证类加载的顺序,使用两个不同的类加载器可能会以不同的顺序加载类,如果有重复就会导致不同的行为。

关于java - IntelliJ 中出现 NoSuchMethodError,但 Eclipse 中没有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29880584/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com