Исключение при запуске кода Java через командную строку - PullRequest
1 голос
/ 02 мая 2010

У меня есть простой класс

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.

Ответы [ 2 ]

7 голосов
/ 02 мая 2010

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

java chapter10.CompilationTest

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

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

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

java -cp "C:\...\Test\src" chapter10.CompilationTest
4 голосов
/ 02 мая 2010

Запуск с использованием java chapter10.PropertiesTest. Команда Java ожидает полное имя класса Java, , а не путь к файлу байт-кода.

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

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

  2. Для каждой записи в classpath ищите путь к записи.

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

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

Как говорит @BalusC, рекомендуется использовать аргумент "-cp" или создать скрипт-обертку для запуска вашего приложения. Полагаться на $ CLASSPATH вашей оболочки немного непонятно, потому что вы никогда не знаете, когда он может быть переопределен или сброшен.

(Это упрощенное описание. Оно не охватывает «путь загрузки bootclass», пути к классам, устанавливаемые в загружаемых файлах JAR, загрузку классов по URL-адресам, обработку внутренних / анонимных классов и т. Д., И т. Д.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...