2010-05-02 2 views
1

У меня есть простой классИсключение при выполнении кода Java с помощью командной строки

package chapter10; 

public class CompilationTest { 


    public static void main(String[] args) { 
    System.out.println("HELLO WORLD"); 
    } 

} 

Путь

Test\src\chapter10\CompilationTest.java 

Я успешно компилируется код в ту же папку, и теперь у меня есть

Test\src\chapter10\CompilationTest.class 

Однако, когда я пытаюсь запустить из той же папки, я получаю эту ошибку

>java CompilationTest 


Exception in thread "main" java.lang.NoClassDefFoundError: CompilationTest (wrong name: chapter10/CompilationTest) 
     at java.lang.ClassLoader.defineClass1(Native Method) 
     at java.lang.ClassLoader.defineClassCond(Unknown Source) 
     at java.lang.ClassLoader.defineClass(Unknown Source) 
     at java.security.SecureClassLoader.defineClass(Unknown Source) 
     at java.net.URLClassLoader.defineClass(Unknown Source) 
     at java.net.URLClassLoader.access$000(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) 
Could not find the main class: CompilationTest. Program will exit. 

Когда я бегу, используя

>java chapter10/PropertiesTest 

Exception in thread "main" java.lang.NoClassDefFoundError: chapter10/PropertiesTest 
Caused by: java.lang.ClassNotFoundException: chapter10.PropertiesTest 
     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) 
Could not find the main class: chapter10/PropertiesTest. Program will exit. 

ответ

7

Класс в пакете chapter10. Запустите его из родительского каталога как:

java chapter10.CompilationTest 

Причина собирается родителя в том, что Java ищет его CLASSPATH, который включает в себя текущий каталог, для chapter10 каталога, содержащего CompilationTest.class файл.Можно также добавить абсолютный путь к текущему каталогу Src, чтобы в CLASSPATH, чтобы добиться того же эффекта:

set CLASSPATH=C:\...\Test\src 
java chapter10.CompilationTest 

Or (по-видимому, это лучше стиль) добавить -cp или -classpath аргумент Java:

java -cp "C:\...\Test\src" chapter10.CompilationTest 
+0

Почему Java хочет, чтобы я сначала пошел в родительский каталог? – unj2

+0

Я добавил разъяснение к ответу. –

+4

Переменная среды CLASSSPATH считается плохой практикой. Скорее используйте аргумент '-cp' или' -classpath' или просто файл '.bat' /' .sh'. – BalusC

4

Выполнить с помощью java chapter10.PropertiesTest. Команда Java ожидает полнофункциональное имя класса Java, не путь к файлу байт-кода.

Команда Java находит классы для загрузки, просматривая путь к классам. Это список каталогов или файлов JAR для поиска по порядку. Используемый алгоритм примерно следующий:

  1. Возьмите полное имя класса, замените «.». символы с соответствующим символом разделителя файлов (например, «/» или «\») и добавьте «.class» в конец. Результатом является путь.

  2. Для каждой записи в пути к классам найдите путь по отношению к записи.

    1. Если поиск выполнен успешно, загрузите соответствующий файл.
    2. В противном случае перейдите к следующему элементу pathpath.
  3. Если поиск не удался, бросьте ClassNotFoundException.

Путь к классам можно установить с помощью явного параметра командной строки (-cp <path>) или он может быть подобран из переменных в CLASSPATH окружающей среды. Если classpath не установлен ни одним из этих методов, путь класса по умолчанию "." , где "." обозначает текущий каталог.

Как поясняет @BalusC, наилучшей практикой является использование аргумента «-cp» или создание сценария-оболочки для запуска приложения. Опора на CLASSSPATH вашей оболочки немного пушистая, потому что вы никогда не знаете, когда ее можно было бы переопределить или сбросить.

(Это упрощенное описание. Это не распространяется «» загрузочного пути к классам пути к классам установлен скомпилированы JAR-файлов, загрузки классов из URL, как внутренние/анонимные классы обрабатываются и т.д., и т.д.)

Смежные вопросы