Я пытаюсь понять, как банки и пакеты работают в Java.Поэтому для этого я создал простой тестовый JAR и пытаюсь использовать класс, содержащийся в этом jar.Достаточно просто, но это дает мне ошибки типа "класс не найден".Вот настройки:
1) У меня есть файл с именем MyHelloWorld.java, который будет упакован в JAR:
package com.mytest;
public class MyHelloWorld {
public String getHello() {
return "Hello";
}
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
2) У меня есть другой файл с именем 'HelloHello.java'который использует функцию getHello()
в com.mytest.MyHelloWorld
import com.mytest.*;
public class HelloHello {
public static void main (String[] args) {
MyHelloWorld hello = new MyHelloWorld();
System.out.println(hello.getHello());
}
}
3) Чтобы упаковать класс MyHelloWorld внутри JAR, я создал папки com/mytest
в текущем каталоге и переместил MyHelloWorld.javaв эту папку
4) Я скомпилировал MyHelloWorld.java в этой папке, используя javac MyHelloWorld.java
5) Я запустил jar -cf myhello.jar ./com/mytest/*.class
из корневой папки, чтобы создать файл JAR (как описано в http://www.javacoffeebreak.com/faq/faq0028.html)
6) Я скопировал HelloHello.java и myhello.jar в новую папку, в которой больше ничего нет, чтобы проверить эту настройку
7) javac -cp ./*.jar HelloHello.java
[успешно]
8) java -cp ./*.jar HelloHello
[FAILS] (я также попробовал просто `java HelloWorld ', что тоже не удалось, с другим сообщением об ошибке)
Этот последний оператор завершается ошибкой с сообщением:
$java -cp ./*.jar HelloHello
Exception in thread "main" java.lang.NoClassDefFoundError: HelloHello
Caused by: java.lang.ClassNotFoundException: HelloHello
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:315)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:330)
at java.lang.ClassLoader.loadClass(ClassLoader.java:250)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:398)
Есть идеи, почему это не удается?Любые идеи, которые вы можете сообщить о том, почему он работает таким образом, и как имена пакетов определяются внутри JAR и т. Д., Также приветствуются!