#java #jvm
#java #jvm
Вопрос:
Я пытаюсь провести небольшой тест, работающий на Java. У меня есть два каталога root
и root/lib
. У меня есть root/lib/Test.java
файл и root/Foo.java
file. Я могу скомпилировать оба с javac lib/Test.java
, а затем javac -classpath lib Foo.java
и получить:
root/
Foo.java
Foo.class
lib/
Test.java
Test.class
вот как они выглядят:
class Foo {
static public void main(String[] argv) {
System.out.println(Test.test());
}
}
и
class Test {
public static int test() {
return 2;
}
}
Как мне запустить их, чтобы они работали вместе, не добавляя инструкцию import? Я пробовал java -classpath ".;lib" Foo
, но я просто получаю java.lang.NoClassDefFoundError: Foo
Lala: jeena$ cd root
Lala:root jeena$ java -classpath ".;lib" Foo
Exception in thread "main" java.lang.NoClassDefFoundError: Foo
Caused by: java.lang.ClassNotFoundException: Foo
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)
Ответ №1:
Это говорит о том, что вы находитесь в родительском каталоге root:
javac -classpath root / библиотека Foo.java
И это говорит о том, что вы находитесь в root:
java -classpath «.;lib» Foo
Из какого каталога вы на самом деле работаете? Возможно, абсолютные пути были бы проще для вас?
Кроме того, какая операционная система? В Linux, например, ваш разделитель пути будет :
вместо ;
.
Комментарии:
1. Я пробовал это на Linux и OS X. На самом деле я был в root, возможно, мне следует немного переписать вопрос.
2. О, ах! Хорошо, теперь я понял, я должен использовать «:» вместо «;» большое вам спасибо!
Ответ №2:
Я не уверен, в чем собственно проблема — если вы работаете в Windows, и ни один из классов не использует определенное имя пакета (т. Е. Они находятся в неназванном пакете, который вам не следует использовать), то «java -classpath .;lib Foo» должен иметь возможность загружать и запускать Foo без проблем.
Если они не находятся в одном пакете (который вы не показали), то, пока Test является общедоступным, вы можете получить доступ к методу test(), используя «packageName.goes.here.Test.test()».
Комментарии:
1. Это просто java-файлы без пакета, и я пытался сделать
java -classpath ".;lib" Foo
как в Linux, так и в OS X, и в обоих я получаю ошибку NoClassDefFoundError. Я загрузил файлы со своей файловой структурой сюда: jeena.net/t/java-test.zip2. (Когда я использую его без кавычек .;lib, оболочка становится совершенно сумасшедшей, потому что она думает, что lib — это следующая команда, которая следует, но это не так.)
3. @Jeena Вы используете неправильный разделитель путей, как я уже объяснял.
4. Ах, вы никогда не указывали Linux или OSX, вот почему я указал Windows — the ; является разделителем путей для Windows, а не для UNIX-подобных ОС.
5. Ах да, вы правы, использовались все примеры, которые я видел; instad of : итак, я предположил, что именно так java это делает, спасибо!