Проблемы с путем к классам

#java #classpath

#java #classpath

Вопрос:

У меня есть такая структура каталогов (под Windows): C:JavaProjectsbindebug

В JavaProjects у меня есть Test.java вот так:

 package debug;

public class Test{
    public void debug(String arg){
        System.out.println(arg);
    }
}
  

Он был скомпилирован следующим образом

 javac -d bin Test.java  
  

и в каталоге debug теперь у меня есть Test.class .

Затем я создаю другой класс (также ConditionalCompilation.java в JavaProjects):

 import debug.*;

public class ConditionalCompilation{
    public static void main(String[] args){
                Test a = new Test();
        a.debug("Test");
    }
}          
  

Затем, находясь в JavaProjects, я пишу это:

 C:JavaProjects>javac -classpath .bin ConditionalCompilation.java
  

Ошибок не возникает.

Теперь я пытаюсь это:

 C:JavaProjects>java ConditionalCompilation
  

И получаем это:

 Exception in thread "main" java.lang.NoClassDefFoundError: debug/Test
        at ConditionalCompilation.main(ConditionalCompilation.java:5)
Caused by: java.lang.ClassNotFoundException: debug.Test
        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)
        ... 1 more
  

Не могли бы вы помочь мне понять, что я сделал неправильно?

Ответ №1:

Класс, который вы пытаетесь запустить, и его зависимость находятся на двух разных путях к классам. Test класс имеет корни внутри bin , тогда как ConditionalCompilation класс имеет корни внутри родительского каталога.

Одним из исправлений является явное указание пути к классу зависимостей.

 java -classpath bin;. ConditionalCompilation
  

Другое исправление заключается в компиляции в bin каталог и запуске из него.

 javac -d .bin -classpath .bin ConditionalCompilation.java
cd bin
java ConditionalCompilation
  

Комментарии:

1. Работает. Спасибо. Но я ничего не могу понять. Почему на двух разных путях к классам?

2. @user3475946, Потому что в вашей первой строке компиляции использовалась -d опция для размещения библиотеки в другом пути к классу.