我正在尝试使用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();
}
}
建筑格拉德尔
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'
}
注意:我认为这与我的类路径上有同一个Application类的两个不同版本有关。为什么我只导入一个?
我昨天遇到了这个问题,使用的是Maven,而不是Gradle。您是对的,问题是由于在同一个包中有两个具有相同类名的JAR:java。ws。rs.core。应用
我能够通过搜索依赖树并找到哪个jar的依赖项引入了Application的jersey版本并使用Maven的排除标签将其排除在外来修复它。
在你的例子中,这是非常明显的:类加载器看到java.ws.rs.core.应用程序的两个版本,并从org.glassfish.jersey.core中选择一个不是你想要的版本。
至于为什么它在Eclipse而不是IDEA中工作,类加载器不能保证类的加载顺序,使用两个不同的类加载器可能会以不同的顺序加载类,如果存在会导致不同行为的重复。
我在多模块maven项目中遇到以下问题: 该项目最初是在Eclipse中创建的,可以在那里编译和运行。它也可以用构建。 现在,当我使用以下导入选项将项目导入Intellij时,将识别父pom.xml,并导入项目及其模块。 一切看起来都很好,但是当我试图编译它时,一个类,它有一个来自另一个模块的类作为依赖项,找不到。 我尝试了很多解决方案,唯一对我有效的是过时的maven idea插件。现在,每当任
我在IntelliJ中编译Maven项目时遇到了麻烦。 如果运行from commandline=success 如果单击intelj=success中的“重新导入所有Maven项目”图标 如果我单击IntelliJ=success中的“为所有项目生成源和更新文件夹”图标 如果我单击Maven Projects面板中的“install”Lifecycle=success 在Maven“安装”之后,
但是,如果我使用进行构建,就可以了。我试过这里所有的方法,但还是没有运气。有什么建议吗?
新创建的后台进程具有与预期不同的上下文。无法重新连接到此后台进程。上下文不匹配: Java主页不同。 需要:defaultdaemoncontext[uid=null,javahome=/home/administrator/downloads/idea-iu-145.1617.8/jre,daemonregistrydir=/home/administrator/.gradle/daemon,p
mvn清洁安装-成功构建。 java-jar-app成功运行。 mvn spring启动:运行-引发错误: 检测到类路径上的log4j-over-slf4j.jar和绑定slf4j-log4j12.jar,抢占StackOverflow Error。有关更多详细信息,请参阅http://www.slf4j.org/codes.html#log4jDelegationLoop。 什么是mvn spr
我知道有人问过类似的问题(这里,这里,这里),但似乎没有一个答案适用于我的案例。 考虑以下一组接口: 现在我想在< code>I3的实例上调用< code >方法(String),如下所示: OpenJDK(Java 7 或 8,无关紧要)在此处标记了不兼容错误: 由于< code>X在< code>I3中被实例化为< code>String,我看不出问题出在哪里。请注意,Eclipse认为这没有