Используя банку в проекте Java? - PullRequest
1 голос
/ 09 июня 2009

Я пытаюсь использовать открытые методы / классифицированные из проекта, представленного в виде файла JAR (например, с именем Hello.jar), упакованного в пакет с именем hello.

package hello;

public class Hello
{

 public static void main(String[] args)
 {
    coucou();
 }

 public static void coucou()
 {
   System.out.println("Hello there");
 }

}

В отдельном проекте под названием Tool я хочу иметь возможность вызывать метод Hello.coucou(), поэтому я написал что-то вроде этого:

import hello.*;

public class Tool
{

 public static void main(String[] args)
 {
   System.out.println("main program running");
   Hello.coucou();

 }

}

и я скомпилировал Tool.java с помощью следующей команды (под linux):

$ javac Tool.java -classpath .:./extern/:

где Hello.jar находится в папке ./extern

Кажется, что это хорошо скомпилируется, но когда я запускаю его (т.е. java Tool), я получаю следующее:

main program running
Exception in thread "main" java.lang.NoClassDefFoundError: hello/Hello
    at Tool.main(Tool.java:9)
Caused by: java.lang.ClassNotFoundException: hello.Hello
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:323)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:268)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:336)
    ... 1 more

Я новичок в Java (фон C / C ++) и не понимаю, что делаю неправильно. Есть идеи?

Приветствие David


Редактировать: Я пытался добавить Hello.jar в путь к классам в командной строке, но все равно получаю ту же ошибку:

$ javac Tool.java -classpath .:./extern/Hello.jar:
$ java Tool -classpath .:./extern/Hello.jar:
main program running
Exception in thread "main" java.lang.NoClassDefFoundError: hello/Hello
    at Tool.main(Tool.java:9)
Caused by: java.lang.ClassNotFoundException: hello.Hello
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:323)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:268)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:336)
    ... 1 more

Ответы [ 6 ]

4 голосов
/ 09 июня 2009

Вам нужен Hello.jar на пути к классам при запуске, а также при компиляции.

2 голосов
/ 09 июня 2009

На самом деле трюк был в порядке аргументов в командной строке:

Если -cp (или -classpath) установлен последним, тогда он не работает

java Tool -cp .:extern/Hello.jar

Это должно быть сначала как:

java -cp .:extern/Hello.jar Tool

!!!

1 голос
/ 09 июня 2009

Java использует динамическое позднее связывание, поэтому размещение JAR в пути к классам во время компиляции необходимо только для того, чтобы гарантировать, что ваш код использует классы из него правильно, но фактически не встраивает их в ваш код, как это делает компоновщик в C / C ++. Таким образом, вам нужно установить classpath также при выполнении кода.

Однако это:

$ javac Tool.java -classpath .:./extern/:

также не должно работать, поскольку JAR-файлы необходимо помещать непосредственно в classpath, а не просто в каталог, в котором они живут:

$ javac Tool.java -classpath .:./extern/Hello.jar

Наконец, вы помещаете свой код в безымянный пакет по умолчанию. Это нормально для дурачения, но в долгосрочной перспективе это вызовет проблемы (во-первых, вы не можете импортировать классы из пакета по умолчанию где-либо еще).

1 голос
/ 09 июня 2009

При запуске Java вы также должны добавить файл jar (только добавление пути к каталогу не работает).

См. classpath Информация.

Это должно быть примерно так:

java -classpath /java/MyClasses/myclasses.jar utility.myapp.Cool
0 голосов
/ 09 июня 2009

java -cp xxx.jar привет, где xxx - это jar, который вы хотите иметь в вашем classpath, если вы хотите использовать несколько jar, разделите их, используя;

Карлу

0 голосов
/ 09 июня 2009

Вам нужно включить файл Hello.jar в путь к классам, когда вы его тоже запустите.

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