在eclipse中运行独立的java可执行文件导致NoClassDefFound

时间:2014-02-04 21:58:07

标签: java eclipse maven

您好我有一个基本的Jersey客户端,我试图在我的“主”java类中使用main()运行。它在Eclipse中编译很好,但当我尝试将其作为java应用程序运行时,我得到:

Caused by: java.lang.ClassNotFoundException: org.glassfish.jersey.client.JerseyClientBuilder

谁能告诉我我做错了什么?这是我的pom.xml:

<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>ca.ubc.iamwsClient</groupId>
    <artifactId>iamwsClient</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>iamwsClient</name>
    <properties>
        <jersey.version>2.5.1</jersey.version>
        <target.dir>target</target.dir>
        <project.build.directory>target</project.build.directory>
    </properties>
    <repositories>
        <repository>
            <id>JBoss Repository</id>
            <url>https://repository.jboss.org/nexus/content/groups/public</url>
        </repository>
    </repositories>
    <dependencies>
        <!-- jackson dependencies for pojo/json support -->
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-json-jackson</artifactId>
            <version>${jersey.version}</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-json-processing</artifactId>
            <version>${jersey.version}</version>
        </dependency>
        <!-- end jackson deps -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.9</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.core</groupId>
            <artifactId>jersey-client</artifactId>
            <version>${jersey.version}</version>
        </dependency>
        <!-- <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-client</artifactId> 
            <version>1.8</version> </dependency> -->
        <dependency>
            <groupId>org.glassfish.jersey.connectors</groupId>
            <artifactId>jersey-apache-connector</artifactId>
            <version>${jersey.version}</version>
        </dependency>
        <dependency>
            <groupId>javax.ws.rs</groupId>
            <artifactId>javax.ws.rs-api</artifactId>
            <version>2.0</version>
        </dependency>
        <!-- <dependency> <groupId>javax.ws.rs</groupId> <artifactId>jsr311-api</artifactId> 
            <version>1.1</version> </dependency> -->
    </dependencies>
    <build>
        <finalName>iamwsClient</finalName>
        <outputDirectory>${basedir}/${target.dir}/classes</outputDirectory>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.5.1</version>
                <inherited>true</inherited>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/classes/lib</outputDirectory>
                            <overWriteReleases>false</overWriteReleases>
                            <overWriteSnapshots>false</overWriteSnapshots>
                            <overWriteIfNewer>true</overWriteIfNewer>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.eclipse.m2e</groupId>
                <artifactId>lifecycle-mapping</artifactId>
                <configuration>
                    <lifecycleMappingMetadata>
                        <pluginExecutions>
                            <!-- copy-dependency plugin -->
                            <pluginExecution>
                                <pluginExecutionFilter>
                                    <groupId>org.apache.maven.plugins</groupId>
                                    <artifactId>maven-dependency-plugin</artifactId>
                                    <versionRange>[0.0,)</versionRange>
                                    <goals>
                                        <goal>copy-dependencies</goal>
                                    </goals>
                                </pluginExecutionFilter>
                                <action>
                                    <ignore />
                                </action>
                            </pluginExecution>
                        </pluginExecutions>
                    </lifecycleMappingMetadata>
                </configuration>
            </plugin>
            <!-- <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.2.1</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>java</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <mainClass>ca.ubc.iamwsClient.IamwsClient</mainClass>
                </configuration>
            </plugin> -->
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>ca.ubc.iamwsClient.IamwsClient</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
        </plugins>
        <pluginManagement>
            <plugins>
                <!--This plugin's configuration is used to store Eclipse m2e settings 
                    only. It has no influence on the Maven build itself. -->
                <plugin>
                    <groupId>org.eclipse.m2e</groupId>
                    <artifactId>lifecycle-mapping</artifactId>
                    <version>1.0.0</version>
                    <configuration>
                        <lifecycleMappingMetadata>
                            <pluginExecutions>
                                <pluginExecution>
                                    <pluginExecutionFilter>
                                        <groupId>
                                            org.apache.maven.plugins
                                        </groupId>
                                        <artifactId>
                                            maven-dependency-plugin
                                        </artifactId>
                                        <versionRange>
                                            [2.1,)
                                        </versionRange>
                                        <goals>
                                            <goal>
                                                copy-dependencies
                                            </goal>
                                        </goals>
                                    </pluginExecutionFilter>
                                    <action>
                                        <ignore></ignore>
                                    </action>
                                </pluginExecution>
                            </pluginExecutions>
                        </lifecycleMappingMetadata>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

我正在尝试运行的客户:

package ca.ubc.iamwsClient;

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import org.glassfish.jersey.jackson.JacksonFeature;

import ca.ubc.iamwsClient.json.CreateEmployeeBean;
import ca.ubc.iamwsClient.json.CreateEmployeeResponseBean;


    /**
     * Main class.
     *
     */
    public class IamwsClient {

        private WebTarget getTarget(String targetUrl) throws Exception {
            // create the client
            Client c = ClientBuilder.newClient().register(JacksonFeature.class);
            return c.target(targetUrl);
        }

public CreateEmployeeResponseBean sendCreateEmployeeRequest(CreateEmployeeBean createBean, String url) {
    CreateEmployeeResponseBean rb = null;
    try {
        WebTarget target = getTarget(url);
        WebTarget wt = target.path("employeeAutoCreate");
        WebTarget generateTarget = wt.path("generate");

        rb = generateTarget.request(MediaType.APPLICATION_JSON_TYPE).post(Entity.entity(createBean,MediaType.APPLICATION_FORM_URLENCODED_TYPE), 
                                    CreateEmployeeResponseBean.class);
        System.out.println("CreateEmployee:  generate response:  success=" + rb.getSuccess() + " message=" + rb.getMessage());
    } catch (Throwable t) {
        t.printStackTrace();
        System.out.println("*********EXCEPTION THROWN: " + t.getMessage());
    }   
    return rb;
}

        public static void main(String[] args) {
            String testUrl="http://localhost:9090/iamws";
            CreateEmployeeBean bean = new CreateEmployeeBean();
            // ... set some details on bean....
            IamwsClient client = new IamwsClient();
            CreateEmployeeResponseBean response = client.sendCreateEmployeeRequest(bean, testUrl);

            if (response != null) {
                System.out.println("*********server responded with flag:  " + response.getSuccess() + " message: " + response.getMessage());
            }
        }

    }

1 个答案:

答案 0 :(得分:5)

您需要确保在运行时期间应用程序的类路径中包含包含org.glassfish.jersey.client.JerseyClientBuilder类的JAR依赖项。 NoClassDefFound错误实际上没有其他解释。

我可以在这个课程上谷歌,它应该在

中提供
<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-client</artifactId>
    <version>2.0-m04</version>
</dependency>

换句话说,您的com.sun.jersey依赖关系可能会遗漏。

修改

这是OP随后在问题中添加的实际答案:

    <jersey.version>2.5.1</jersey.version>

    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-processing</artifactId>
        <version>${jersey.version}</version>
    </dependency>

    <dependency>
        <groupId>javax.ws.rs</groupId>
        <artifactId>javax.ws.rs-api</artifactId>
        <version>2.0</version>
    </dependency>

他已经有org.glassfish.jersey.coreorg.glassfish.jersey.connectors。他删除了com.sun.jersey依赖。

我很快就会尝试这个。