Im работает с java-сервером debian, которому необходимо отправлять и получать объекты типа EventObject и PostObject (например, serializable). Они были помещены в файл .jar SharedModels.jar и используются как на клиенте, так и на сервере.Общий файл Jar между сервером и клиентом - NoClassDefFoundError
При попытке компиляции на Debian, я получаю выход
ServerThread.java:10: error: package Models does not exist
import Models.EventObject;
^
ServerThread.java:11: error: package Models does not exist
import Models.PostObject;
^
Database.java:100: error: cannot find symbol
ArrayList<PostObject> posts = new ArrayList<>();
^
На установке окон (Eclipse), используя
import Models.EventObject;
import Models.PostObject;
работает отлично (в том числе внешний Jar через Eclipse).
Как я могу сделать java понять, что это Infact эти классы, которые я хочу использовать на Debian?
Я добавил местоположение банки в мой путь к классу в/etc/environment.
Возможно, проблема в том, как устроена банка? например что он состоит из пакета, который содержит два класса?
С уважением и спасибо заранее
EDIT: Сделано это компилироваться, но когда метод вызывается, сервер не распознает класс больше. Это выход:
Exception in thread "Thread-0" java.lang.NoClassDefFoundError: Models/PostObject
at server.Database.getPosts(Database.java:101)
at server.ServerThread.run(ServerThread.java:47)
Caused by: java.lang.ClassNotFoundException: Models.PostObject
at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 2 more
Я понял, что это потому, что JVM делает распознает класс в compiletime, но не во время выполнения .. или что-то не так с пути к классам. Должно ли имя фактического .jar иметь какое-либо именование для хранения пакета, содержащегося внутри? Что мне нужно сделать, чтобы исправить это?
Как вы пытаетесь скомпилировать это на Linux? – peterh
(1) Это именно та проблема, которую Maven и Gradle решают для вас. (2) Используйте стандартные соглашения для наименования пакетов - строчные буквы и начинайте с 'com.example'. – chrylis
скомпилирован с использованием файла файла javac -cp jar1.jar: jar2.jar – enrm