#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
опция для размещения библиотеки в другом пути к классу.