ClassNotFoundException 与 ResteasyClientBuilder (JBOSS)
ClassNotFoundException with ResteasyClientBuilder (JBOSS)
类似的问题已经发布here and here,但前者只提出了NoSuchMethodError
的解决方案,而后者甚至没有提到ResteasyClientBuilder
,这正是我每次出错的原因尝试从我的客户端调用 get
方法。
我正在使用 WildFly、Maven、RESTEasy/JBoss。我可以在命令提示符下使用 standalone
成功 运行 我的 WildFly 服务器,并使用 maven 将 war
文件部署到 WildFly 服务器,并在 browser/Postman 接收结果。但是,如果我尝试从客户端代码中调用完全相同的 get
方法,则会出现以下错误。这是由 ResteasyClientBuilder
.
引起的
怎么了?我的 pom 中有最少的依赖项和插件,服务器代码可以工作,但客户端没有。我的 pom 使用版本“3.0.19.Final”,因为这是 C:\Users\ME\Documents\Wildfly\wildfly-10.1.0.Final\modules\system\layers\base\org\jboss\resteasy\resteasy-jaxrs\main
中 resteasy-jaxrs-3.0.19.Final.jar
的 jar 版本
错误:
Exception in thread "main" java.lang.NoClassDefFoundError: org/jboss/resteasy/client/jaxrs/ResteasyClientBuilder
at com.sample.ClientDemo.main(ClientDemo.java:21)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Caused by: java.lang.ClassNotFoundException: org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 6 more
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.sample</groupId>
<artifactId>rest-demo</artifactId>
<version>1.0.SNAPSHOT</version>
<packaging>war</packaging>
<name>rest-demo</name>
<properties>
<endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-client</artifactId>
<version>3.0.19.Final</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>3.0.19.Final</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerArguments>
<endorseddirs>${endorsed.dir}</endorseddirs>
</compilerArguments>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
<plugin>
<groupId>org.wildfly.plugins</groupId>
<artifactId>wildfly-maven-plugin</artifactId>
<version>1.1.0.Alpha11</version>
<configuration>
<name>rest-demo.war</name>
</configuration>
</plugin>
</plugins>
</build>
</project>
服务器代码(HelloWorld.java)
import javax.ws.rs.*;
@Path("tutorial")
public class HelloWorld
{
@GET
@Path("helloname/{name}")
public String hello(@PathParam("name") final String name) {
return "Hello " +name;
}
}
客户端代码 (ClientDemo.java)
import org.jboss.resteasy.client.jaxrs.ResteasyClient;
import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder;
import org.jboss.resteasy.client.jaxrs.ResteasyWebTarget;
import javax.ws.rs.core.Response;
public class ClientDemo {
public static void main(String[] args) {
ResteasyClient client = new ResteasyClientBuilder().build(); // <-- Error occurs here
ResteasyWebTarget target = client.target("http://localhost:8080/rest-demo/rest/tutorial/helloname/john");
Response response = target.request().get();
String value = response.readEntity(String.class);
response.close();
}
}
在 IntelliJ 中编辑配置
即使在明确引用客户端 jar 之后错误仍然存在。怎么了?
您需要将maven 项目分成两部分。一个用于客户演示。另一个 war。在 war 的 pom 中仅添加对 org.jboss.resteasy:jaxrs-api 的依赖并提供它。在客户端 pom 添加对 org.jboss.resteasy:resteasy-client WITHOUT provided 的依赖(maven exec 插件不在类路径中包含提供的依赖)
我将我的 reasteasy 演示项目放在 github (server, client) 上。
它测试额外的功能并且需要更多的依赖性然后在你的情况下。客户端可以通过 mvn exec:exec
工作
你能解释一下你是如何从 eclipse 或 cmd 运行ning 客户端代码的吗?
如果它来自 eclipse,只需将 Maven 依赖项添加到库和 运行 一个 java 程序,或者如果来自 cmd,则将 Maven 依赖项添加到 class 路径。
野蝇还可以。我认为这是您的客户的 class 路径没有使用它需要的所有罐子。这是我用来 运行 ClientDemo
class:
的命令
java -cp "/.../.m2/repository/org/jboss/logging/jboss-logging/3.1.4.GA/jboss-logging-3.1.4.GA.jar:/.../.m2/repository/org/jboss/resteasy/resteasy-client/3.0.19.Final/resteasy-client-3.0.19.Final.jar:/.../.m2/repository/org/jboss/resteasy/resteasy-jaxrs/3.0.19.Final/resteasy-jaxrs-3.0.19.Final.jar:/.../.m2/repository/org/jboss/spec/javax/ws/rs/jboss-jaxrs-api_2.0_spec/1.0.0.Final/jboss-jaxrs-api_3.0_spec-2.0.0.Final.jar:/.../.m2/repository/org/jboss/spec/javax/annotation/jboss-annotations-api_1.2_spec/1.0.0.Final/jboss-annotations-api_1.2_spec-1.0.0.Final.jar:/.../.m2/repository/javax/activation/activation/1.1.1/activation-1.1.1.jar:/.../.m2/repository/org/apache/httpcomponents/httpclient/4.3.6/httpclient-4.3.6.jar:/.../.m2/repository/org/apache/httpcomponents/httpcore/4.3.3/httpcore-4.3.3.jar:/.../.m2/repository/commons-logging/commons-logging/1.1.3/commons-logging-1.1.3.jar:/.../.m2/repository/commons-codec/commons-codec/1.6/commons-codec-1.6.jar:/.../.m2/repository/commons-io/commons-io/2.1/commons-io-2.1.jar:/.../.m2/repository/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar:/.../Desktop/javax.ws.rs-api-2.0.jar:." edu.nova.client.ClientDemo
请注意,要 运行 我必须下载 javax.ws.rs-api-2.0.jar
但在我的情况下,Eclipse 在 运行 ClientDemo
IDE 时提供了它.我不知道 IntellJ,但请检查启动配置 classpath 中的内容。
类似的问题已经发布here and here,但前者只提出了NoSuchMethodError
的解决方案,而后者甚至没有提到ResteasyClientBuilder
,这正是我每次出错的原因尝试从我的客户端调用 get
方法。
我正在使用 WildFly、Maven、RESTEasy/JBoss。我可以在命令提示符下使用 standalone
成功 运行 我的 WildFly 服务器,并使用 maven 将 war
文件部署到 WildFly 服务器,并在 browser/Postman 接收结果。但是,如果我尝试从客户端代码中调用完全相同的 get
方法,则会出现以下错误。这是由 ResteasyClientBuilder
.
怎么了?我的 pom 中有最少的依赖项和插件,服务器代码可以工作,但客户端没有。我的 pom 使用版本“3.0.19.Final”,因为这是 C:\Users\ME\Documents\Wildfly\wildfly-10.1.0.Final\modules\system\layers\base\org\jboss\resteasy\resteasy-jaxrs\main
resteasy-jaxrs-3.0.19.Final.jar
的 jar 版本
错误:
Exception in thread "main" java.lang.NoClassDefFoundError: org/jboss/resteasy/client/jaxrs/ResteasyClientBuilder
at com.sample.ClientDemo.main(ClientDemo.java:21)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Caused by: java.lang.ClassNotFoundException: org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 6 more
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.sample</groupId>
<artifactId>rest-demo</artifactId>
<version>1.0.SNAPSHOT</version>
<packaging>war</packaging>
<name>rest-demo</name>
<properties>
<endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-client</artifactId>
<version>3.0.19.Final</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>3.0.19.Final</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerArguments>
<endorseddirs>${endorsed.dir}</endorseddirs>
</compilerArguments>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
<plugin>
<groupId>org.wildfly.plugins</groupId>
<artifactId>wildfly-maven-plugin</artifactId>
<version>1.1.0.Alpha11</version>
<configuration>
<name>rest-demo.war</name>
</configuration>
</plugin>
</plugins>
</build>
</project>
服务器代码(HelloWorld.java)
import javax.ws.rs.*;
@Path("tutorial")
public class HelloWorld
{
@GET
@Path("helloname/{name}")
public String hello(@PathParam("name") final String name) {
return "Hello " +name;
}
}
客户端代码 (ClientDemo.java)
import org.jboss.resteasy.client.jaxrs.ResteasyClient;
import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder;
import org.jboss.resteasy.client.jaxrs.ResteasyWebTarget;
import javax.ws.rs.core.Response;
public class ClientDemo {
public static void main(String[] args) {
ResteasyClient client = new ResteasyClientBuilder().build(); // <-- Error occurs here
ResteasyWebTarget target = client.target("http://localhost:8080/rest-demo/rest/tutorial/helloname/john");
Response response = target.request().get();
String value = response.readEntity(String.class);
response.close();
}
}
在 IntelliJ 中编辑配置
即使在明确引用客户端 jar 之后错误仍然存在。怎么了?
您需要将maven 项目分成两部分。一个用于客户演示。另一个 war。在 war 的 pom 中仅添加对 org.jboss.resteasy:jaxrs-api 的依赖并提供它。在客户端 pom 添加对 org.jboss.resteasy:resteasy-client WITHOUT provided 的依赖(maven exec 插件不在类路径中包含提供的依赖) 我将我的 reasteasy 演示项目放在 github (server, client) 上。 它测试额外的功能并且需要更多的依赖性然后在你的情况下。客户端可以通过 mvn exec:exec
工作你能解释一下你是如何从 eclipse 或 cmd 运行ning 客户端代码的吗? 如果它来自 eclipse,只需将 Maven 依赖项添加到库和 运行 一个 java 程序,或者如果来自 cmd,则将 Maven 依赖项添加到 class 路径。
野蝇还可以。我认为这是您的客户的 class 路径没有使用它需要的所有罐子。这是我用来 运行 ClientDemo
class:
java -cp "/.../.m2/repository/org/jboss/logging/jboss-logging/3.1.4.GA/jboss-logging-3.1.4.GA.jar:/.../.m2/repository/org/jboss/resteasy/resteasy-client/3.0.19.Final/resteasy-client-3.0.19.Final.jar:/.../.m2/repository/org/jboss/resteasy/resteasy-jaxrs/3.0.19.Final/resteasy-jaxrs-3.0.19.Final.jar:/.../.m2/repository/org/jboss/spec/javax/ws/rs/jboss-jaxrs-api_2.0_spec/1.0.0.Final/jboss-jaxrs-api_3.0_spec-2.0.0.Final.jar:/.../.m2/repository/org/jboss/spec/javax/annotation/jboss-annotations-api_1.2_spec/1.0.0.Final/jboss-annotations-api_1.2_spec-1.0.0.Final.jar:/.../.m2/repository/javax/activation/activation/1.1.1/activation-1.1.1.jar:/.../.m2/repository/org/apache/httpcomponents/httpclient/4.3.6/httpclient-4.3.6.jar:/.../.m2/repository/org/apache/httpcomponents/httpcore/4.3.3/httpcore-4.3.3.jar:/.../.m2/repository/commons-logging/commons-logging/1.1.3/commons-logging-1.1.3.jar:/.../.m2/repository/commons-codec/commons-codec/1.6/commons-codec-1.6.jar:/.../.m2/repository/commons-io/commons-io/2.1/commons-io-2.1.jar:/.../.m2/repository/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar:/.../Desktop/javax.ws.rs-api-2.0.jar:." edu.nova.client.ClientDemo
请注意,要 运行 我必须下载 javax.ws.rs-api-2.0.jar
但在我的情况下,Eclipse 在 运行 ClientDemo
IDE 时提供了它.我不知道 IntellJ,但请检查启动配置 classpath 中的内容。