2

嘿,我正在开发 java 应用程序。我完成了编码部分,但是exception in thread main java.lang.noclassdeffounderror当我运行它时我正在接收。我已经通过互联网搜索了这个,找不到合适的答案。

让我解释一下在将 java 程序从 eclipse 导出到可执行 jar 文件之前我做了什么:

  • 我在我的库中添加了一些 jar 文件,以便我的程序可以连接第 3 方程序。它从一个名为 SSC 的自定义 Jre 运行,并在 3rd 方程序的 (SunSystems) 位置文件夹中获取位置。

  • 我编写了运行程序所需的 java 代码。

  • 然后我运行了这个项目,当我从 Eclipse 运行时它运行良好。

  • 我单击项目名称,然后单击导出。我选择了可​​运行的 jar 文件并将所需的库复制到生成的 jar 文件旁边的子文件夹中。我从启动配置中选择了正确的类。然后点击完成。

当我通过键入从 cmd 运行 jar 文件时,java -jar ssc.jar它给了我这个错误:

exception in thread main java.lang.noclassdeffounderror

和其他一些带有标签的行。

我应该怎么做才能解决这个问题?

一些文档说我需要将类路径添加到程序中,或者编辑清单文件等。我不知道怎么做。

我会很感激你的帮助。谢谢

(编辑)演示包下的SSC.java类。当我从 Eclipse 运行时,它可以工作:

package demo;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import com.systemsunion.ssc.client.*;

public class SSC {

    static String HOST="localhost";
    static int Port=8080;

    public static void main(String[] args) {
        try
        {
            SecurityProvider secman= new SecurityProvider(HOST,true);           
            String voucher= secman.Authenticate("PKP","").toString();
            String sInputPayload="";
            String path="C:/SSC temp/temp.txt";
            BufferedReader reader= new BufferedReader(new FileReader(path));
            BufferedWriter writer= new BufferedWriter(new FileWriter(new File("C:/SSC temp/temp-result.txt")));
            String line="";
            while((line = reader.readLine()) != null)
            {
                sInputPayload = sInputPayload + line;
            }
            try
            {
                SoapComponent ssc= new SoapComponent(HOST, Port);
                ssc.authenticate(voucher);
                String result= ssc.execute("Journal", "Import", sInputPayload);
                writer.write(result);
                writer.newLine();
                writer.close();
            }
            catch(Exception ex)
            {
                ex.printStackTrace();
            }
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
    }
}

当我从 cmd 运行 jar 文件时出错:

Exception in thread "main" java.lang.NoClassDefFoundError: com/systemsunion/ssc/

    client/SoapComponent
            at java.lang.Class.getDeclaredMethods0(Native Method)
            at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
            at java.lang.Class.getMethod0(Unknown Source)
            at java.lang.Class.getMethod(Unknown Source)
            at sun.launcher.LauncherHelper.getMainMethod(Unknown Source)
            at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
    Caused by: java.lang.ClassNotFoundException: com.systemsunion.ssc.client.SoapCom
    ponent
            at java.net.URLClassLoader$1.run(Unknown Source)
            at java.net.URLClassLoader$1.run(Unknown Source)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.net.URLClassLoader.findClass(Unknown Source)
            at java.lang.ClassLoader.loadClass(Unknown Source)
            at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
            at java.lang.ClassLoader.loadClass(Unknown Source)
            ... 6 more
4

3 回答 3

2

在运行 jar 之前,您需要告诉您的主类是什么。对于简单的情况,您可以这样做:

jar  -uvfe  ssc.jar  your.main.class.Name

请注意,您必须指定主类的全名(包含主方法的类)。这会将标准清单添加到您的 jar 中,您以后可以运行它。

另一种选择是这样运行它:

java -cp ssc.jar your.main.class.Name 

编辑:

问题似乎是你a)不知道你的主类的名字是什么b)你的开发环境缺乏。

为一个)

查找您的主类的定义,这是具有以下内容的类:

public static void main(String[] args) { ... }

注意类名(可能是您评论中的 SSC)。浏览到文件的开头并查找 package 语句。将包名称添加到您的类名中,例如

package org.brave.programmers

public class SSC { ... }

这里的类名是org.brave.programmers.SSC. 如果没有包,它只是SSC

对于 b) 确保路径中有 java.exe 和 jar.exe。如果您没有 jar.exe,则说明您的安装有问题。

请做一个

 jar -tvf ssc.jar

查看 jar 文件中的内容。

于 2013-07-23T08:49:38.167 回答
1

问题在于“将所需的库复制到生成的 JAR 旁边的子文件夹中”。执行此操作时,库将复制到与创建的 jar 文件位于同一文件夹中的子文件夹中。当您尝试运行 jar 文件时,您必须将此子文件夹中的所有 jar 添加到类路径中(我不确定通配符是否有效 - 我认为它们适用于 Java 7):

java -cp sub\jar1.jar;sub\jar2.jar -jar ssc.jar

为避免此问题(必须添加所有 jar 文件很麻烦),您可以使用以下任一方法:

  • 将所需的库提取到生成的 JAR 中
  • 将所需的库打包到生成的 JAR 中

优点是:您的应用程序 JAR 现在将与所有内置依赖项一起旅行,因此它将始终有效。缺点是:一个 JAR 内部有依赖关系(可能会导致一个非常大的 JAR 文件,其中可能只有一小部分是您的实际应用程序)。

编辑:您可能还需要在上面的命令行中添加对项目的引用。有关更多详细信息,请参阅对此答案的评论。

于 2013-07-23T09:29:58.297 回答
1

将 META-INF/MANIFEST.MF 与Class-Path: lib/... .jar.

可能是时候考虑使用Maven插件了。Maven 为杂项提供了构建基础设施。它还大量使用约定;不幸的是,其他默认路径是 src/main/java,但这是值得的。所以先用maven开始一个新项目。但是库版本依赖、库打包等都是免费的。

于 2013-07-23T10:42:59.587 回答