【问题标题】:Shared Jar file between server and client -- NoClassDefFoundError服务器和客户端之间共享 Jar 文件——NoClassDefFoundError
【发布时间】:2015-04-25 22:34:25
【问题描述】:

我正在运行一个 debian java 服务器,它需要发送和接收 EventObject 和 PostObject 类型的对象(例如可序列化)。这些已放置在 .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 中的类路径中。

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 确实在编译时识别该类,但在运行时识别不到。或者类路径有问题。实际 .jar 的名称是否需要命名才能确定其中包含的包?我需要做什么来解决这个问题?

【问题讨论】:

  • 你如何尝试在 linux 上编译这个?
  • (1) 这正是 Maven 和 Gradle 为您解决的问题。 (2) 包命名使用标准约定——小写,以com.example开头。
  • 编译使用javac文件file file -cp jar1.jar:jar2.jar

标签: java linux eclipse windows debian


【解决方案1】:

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

您的错误消息也非常清楚地显示,问题不在于坏 jar,而是它不存在于您的类路径中。您的类路径设置中可能存在一个小问题,可能是:

  • /etc/environment 中的 CLASSPATH 语法是否有效?在windows上,必须用:隔开,而在linux上是;
  • 您将 jar 的 目录 包含在类路径中,而不是 jar 的完整路径?
  • /etc/environment 仅在登录 shell 中设置,之后您是否登录/注销?

无论如何,你可以给你的javac 一个-verbose 标志,它会显示它在哪里尝试加载你的jar。

【讨论】:

  • 你能举一个使用 2 个独立 jar 的类路径的例子吗?这可能是问题所在。
  • 使用javac编译解决:javac file1.java file2.java ... -cp myfirstjar.jar:mysecondjar.jar .
猜你喜欢
  • 2021-03-10
  • 1970-01-01
  • 1970-01-01
  • 2020-05-16
  • 2016-12-04
  • 2015-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多