服务器和客户端之间的共享Jar文件 – NoClassDefFoundError

我运行一个需要发送和接收types为EventObject和PostObject的对象的debian java服务器(例如serializable)。 这些已被放置在一个.jar文件SharedModels.jar中,并在客户端和服务器上使用。

当试图在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<>(); ^ 

Windows上安装(Eclipse),使用

  import Models.EventObject; import Models.PostObject; 

工作正常(包括通过Eclipse的外部Jar)。

我怎么才能让java明白,我想在Debian上使用这些类呢?

我已经将jar的位置添加到/ etc / environment中的类path中。

jar子的构造方式可能有问题吗? 例如它是由包含两个类的包组成的?

提前感谢和感谢

编辑:编译好,但是当方法被调用时,服务器不再承认类。 这是输出:

 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在编译时识别类而不是在运行时期间。或者类path有问题。 实际.jar的名称是否需要有任何命名来包含包含的包? 我需要做什么来解决这个问题?

不,罐子是便携式的,它们之间没有区别。 如果他们在Windows上工作,他们也应该在Linux上工作。

你的错误信息也非常清楚地表明,问题不是坏的jar,而是它不存在于你的类路径中。 在你的类路径设置中可能有一个微不足道的问题,可能是:

  • /etc/environment CLASSPATH语法是否有效? 在Windows上,它必须分开: ,而在Linux上有一个;
  • 你包括你的jar的目录到你的类路径,而不是你的jar的完整路径?
  • /etc/environment仅在登录shell中设置,之后是否登录/注销?

无论如何,你可以给你的javac一个-verbose标志,它会显示,它试图从哪里加载你的罐子。