Как установить java -classpath для двух каталогов?

#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.zip

2. (Когда я использую его без кавычек .;lib, оболочка становится совершенно сумасшедшей, потому что она думает, что lib — это следующая команда, которая следует, но это не так.)

3. @Jeena Вы используете неправильный разделитель путей, как я уже объяснял.

4. Ах, вы никогда не указывали Linux или OSX, вот почему я указал Windows — the ; является разделителем путей для Windows, а не для UNIX-подобных ОС.

5. Ах да, вы правы, использовались все примеры, которые я видел; instad of : итак, я предположил, что именно так java это делает, спасибо!