2015-04-25 4 views
1

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 иметь какое-либо именование для хранения пакета, содержащегося внутри? Что мне нужно сделать, чтобы исправить это?

+1

Как вы пытаетесь скомпилировать это на Linux? – peterh

+0

(1) Это именно та проблема, которую Maven и Gradle решают для вас. (2) Используйте стандартные соглашения для наименования пакетов - строчные буквы и начинайте с 'com.example'. – chrylis

+0

скомпилирован с использованием файла файла javac -cp jar1.jar: jar2.jar – enrm

ответ

1

Нет. Банки портативные, между ними нет разницы. Если они работают над окнами, они также должны работать на Linux.

Ваше сообщение об ошибке также показывает очень четко, что проблема не в плохом jar, но что она не существует в вашем пути к классам. Вероятно, существует тривиальная проблема в настройках вашего класса, вероятно:

  • Действительно ли ваш синтаксис CLASSPATH в вашем /etc/environment действителен? В окнах он должен быть разделен :, а на linux - ;.
  • Вы включили в каталог своей банки в свой путь, а не полный путь к вашей банке?
  • /etc/environment настроен только в оболочке входа, вы вошли в систему/вышли из системы после этого?

В любом случае, вы можете дать javac на -verbose флаг, который будет показывать, где находится это попытаться загрузить ваши банки с.

+0

Можете ли вы привести пример пути к классам, который использует 2 отдельных банки? Это может быть проблемой. – enrm

+0

решена с помощью компиляции javac: 'javac file1.java file2.java ... -cp myfirstjar.jar: mysecondjar.jar'. – enrm

Смежные вопросы