嘿,我正在开发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
答案 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文件,其中可能只有一小部分是您的实际应用程序)。
编辑:您可能还需要在上面的命令行中添加对项目的引用。有关详细信息,请参阅此答案的评论。
答案 2 :(得分:0)
使用带有Class-Path: lib/... .jar
的META-INF / MANIFEST.MF。
可能需要考虑使用 maven 插件。 Maven为各种事物提供构建基础架构。它也大量使用惯例;不幸的是,其他默认路径,src / main / java,但它是值得的。所以随着maven首先开始一个新项目。但随后库版本的依赖性,包装库等等都是免费的。