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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/21564394/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 09:23:35  来源:igfitidea点击:

running standalone java executable in eclipse results in NoClassDefFound

javaeclipsemaven

提问by Nena

Hi I've got a basic Jersey Client that I'm trying to run with a main()in my "main" java class. It compiles fine in Eclipse, but when I try to run it as java application, I get:

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

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

Can anyone tell me what I'm doing wrong? Here's my pom.xml:

谁能告诉我我做错了什么?这是我的 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>
        <!-- Hymanson dependencies for pojo/json support -->
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-json-Hymanson</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 Hymanson 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>

Client that I'm trying to run:

我正在尝试运行的客户端:

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.Hymanson.HymansonFeature;

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(HymansonFeature.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());
            }
        }

    }

采纳答案by maksimov

You need to make sure that the JAR dependency containing org.glassfish.jersey.client.JerseyClientBuilderclass is available on your application's classpath during the run time. There's really no other explanation to NoClassDefFounderror.

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

From what I can google on this class, it should be available in

从我可以在这门课上用谷歌搜索的内容来看,它应该可以在

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

In other words your com.sun.jerseydependency may be missing it.

换句话说,您的com.sun.jersey依赖项可能缺少它。

EDIT

编辑

This is the actual answer which the OP added to the Question afterwards:

这是 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>

He already had org.glassfish.jersey.coreand org.glassfish.jersey.connectors. He removed com.sun.jerseydependency.

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

I am going to try this myself shortly.

我很快就会自己尝试这个。