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 中的内容。