Не удалось найти основной класс в Java, пока я бегу - PullRequest
0 голосов
/ 21 июня 2011

У меня есть Java-код Swing. В этом есть 5 классов, основной класс ссылается на другие четыре класса, здесь я также добавил несколько 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 содержит основной класс, другие классы - это классы 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 ]

3 голосов
/ 21 июня 2011

Вы не запускаете класс Java, рассказывая ему о исходном коде. Вы говорите ему, какой класс запустить. Например:

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

Предполагается, что класс называется JavaSamp в пакете com.foo. Обратите внимание, что когда вы компилируете, вам, вероятно, следует использовать что-то вроде -d ., чтобы указать, чтобы файлы классов помещались в структуру папок с корнем в текущем каталоге на основе имени пакета в исходном файле.

0 голосов
/ 21 июня 2011

Вы должны включить классы, сгенерированные на первом шаге, в путь к классам на втором шаге.

0 голосов
/ 21 июня 2011

Когда вы запускаете java WriteHelper.java, вы говорите Java искать класс с именем "java" в пакете "WriteHelper". Его там нет, и это то, что говорит вам исключение, когда говорит:

Исключение в потоке "main" java.lang.NoClassDefFoundError: WriteHelper / java

Запустите класс как java WriteHelper. Команда java ожидает имя класса ... не имя файла класса.


Существуют и другие проблемы с тем, как вы компилируете и запускаете код.

  • Параметр -cp и его значение должны появляться перед именами исходных файлов Java (для javac) и именем класса Java (для java).

  • Команда java ожидает ОДНОЕ имя класса, а не множество имен классов. Вам необходимо выяснить, какой класс относится к методу public static void main(String[] args), и использовать его (только) в качестве аргумента класса java. (Я полагаю, что если у вас есть класс с именем Main, у которого есть метод точки входа main.)

  • Это будет работать, только если все классы объявлены в классе по умолчанию. Если исходный код начинается с объявления package, вам необходимо организовать классы в дереве каталогов, компоненты которого отражают пакеты классов; см. ответ @Jon Skeet.

Наконец, вам следует внимательно прочитать страницы справочника по java и javac вместе со связанной страницей, в которой рассказывается о том, как работает classpath. Как только вы их поймете, этот материал больше не будет казаться черной магией.

0 голосов
/ 21 июня 2011

Чтобы запустить файл Java, вы указываете, какой файл класса (заканчивается расширением .class, но вы не указываете расширение), а остальные классы и библиотеки (с .jar extension) предоставляются в classpath.

например,

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

Для компиляции файла используйте javac.Что вы сделали, вы сказали java искать java в WriteHelper каталоге (или пакете).

...