可执行jar文件错误

时间:2013-07-23 08:42:25

标签: java eclipse jar

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

让我解释一下我在从eclipse输出java程序到可执行jar文件之前所做的事情:

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

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

  • 然后我运行了这个项目,当我从eclipse运行时它完美运行。

  • 我点击了项目名称,然后点击了导出。我选择了Runnable jar文件,然后将所需的库复制到子文件夹中 生成jar文件。我从发布中选择了正确的课程 组态。然后点击完成。

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

exception in thread main java.lang.noclassdeffounderror

以及带标记的其他一些行。

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

有些文件说我需要添加类路径来编程,或编辑清单文件等。我无法弄清楚如何。

感谢您的帮助。感谢

(编辑)演示包下的SSC.java类。当我从日食中跑出来时它会起作用:

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

3 个答案:

答案 0 :(得分:2)

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

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

请注意,您必须指定主类的全名(包含main方法的名称)。 这将为你的jar添加一个标准清单,你可以从此运行它。

另一种选择是运行它:

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

编辑:

问题似乎在于你a)不知道主类的名称是什么b)你的开发环境不足。

对于a)

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

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

答案 1 :(得分:1)

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

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

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

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

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

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

答案 2 :(得分:0)

使用带有Class-Path: lib/... .jar的META-INF / MANIFEST.MF。

可能需要考虑使用 maven 插件。 Maven为各种事物提供构建基础架构。它也大量使用惯例;不幸的是,其他默认路径,src / main / java,但它是值得的。所以随着maven首先开始一个新项目。但随后库版本的依赖性,包装库等等都是免费的。