我正在运行时无法在Java中找到主类

时间:2011-06-21 09:29:06

标签: java noclassdeffounderror classnotfoundexception

我有一个java swing代码在那里有5个类,Main Class引用其他四个类,这里​​我也添加了一些jar,我给下面的cmd进行编译,

C:\Users\FSSD\Desktop\FinalAttempt\install\lib>javac WriteHelper.java JavaDemo.j
ava DataBaseHelper.java FileEncryption.java SendEmail.java -cp dnsns.jar;dsn.jar
;imap.jar;javaws.jar;jce.jar;jsse.jar;jxl-2.6.jar;localedata.jar;mail.jar;mailap
i.jar;pop3.jar;rt.jar;smtp.jar;sqlitejdbc-v056.jar;sunjce_provider.jar;sunmscapi
.jar;sunpkcs11.jar;tools.jar JavaSamp.java

这里JavaSamp持有mainclass其他类是WriteHelper,JavaDemo,DataBaseHelper,fileEncription和SendEmail类,当我使用上面的cmd编译它成功编译时,当我运行这个类时我有以下异常

C:\Users\FSSD\Desktop\FinalAttempt\install\lib>java WriteHelper.java JavaDemo.ja
va DataBaseHelper.java FileEncryption.java SendEmail.java -cp dnsns.jar;dsn.jar;
imap.jar;javaws.jar;jce.jar;jsse.jar;jxl-2.6.jar;localedata.jar;mail.jar;mailapi
.jar;pop3.jar;rt.jar;smtp.jar;sqlitejdbc-v056.jar;sunjce_provider.jar;sunmscapi.
jar;sunpkcs11.jar;tools.jar JavaSamp
Exception in thread "main" java.lang.NoClassDefFoundError: WriteHelper/java
Caused by: java.lang.ClassNotFoundException: WriteHelper.java
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
Could not find the main class: WriteHelper.java.  Program will exit.

我如何克服它,提前谢谢...

4 个答案:

答案 0 :(得分:3)

您不要通过告诉它有关代码来运行Java类。你告诉它要运行哪个类。例如:

java -cp .;dnsns.jar;...[... as before ...] com.foo.JavaSamp

假设JavaSamp包中有一个名为com.foo的类。请注意,在编译时,您应该使用-d .之类的东西来告诉它根据源文件中的包名称将类文件放入根目录在当前目录中的文件夹结构中。

答案 1 :(得分:0)

要运行java文件,请指定哪个类文件(以.class扩展名结尾但未指定扩展名)以及其他类和库(包含类路径中提供了.jar扩展名。

e.g。

java WriteHelper -classpath "<directory_where_class_file_exists>;mail.jar/localedata.jar;

要编译文件,请改用javac。你做的是你告诉java在java目录(或包)中寻找WriteHelper

答案 2 :(得分:0)

当你运行java WriteHelper.java时,你告诉Java在“WriteHelper”包中寻找一个名为“java”的类。它不存在,这就是异常告诉你的时间:

  

线程“main”中的异常java.lang.NoClassDefFoundError: WriteHelper / java

将课程设为java WriteHelperjava命令需要类名...而不是类文件名。


编译和运行代码的方式还有其他问题。

  • -cp选项及其值必须出现在Java源文件(用于javac)的名称和Java类的名称(用于java)之前。

  • java命令需要一个类名,而不是许多类名。您需要确定哪个类是public static void main(String[] args)方法的类,并使用该类(仅)作为java类参数。 (我猜,如果你有一个名为Main的类具有main入口点方法。)

  • 只有在默认类中声明了所有类时,这才有效。如果源代码以package声明开头,则需要在目录树中组织类,其组件镜像类包;请参阅@Jon Skeet的回答。

最后,建议您仔细阅读javajavac的手册页,以及讨论类路径如何工作的链接页面。一旦你理解了它们,这些东西就不再是黑魔法了。

答案 3 :(得分:0)

您需要在第二步中将第一步中生成的类包含在类路径中。