java.lang.NoClassDefFoundError 尝试从 jar 实例化 class 时

java.lang.NoClassDefFoundError when trying to instantiate class from jar

我确实发现了很多关于此错误的信息,但不知何故 none 的建议解决方案解决了问题。

我正在尝试在 Eclipse 中的 Ubuntu 下使用 libgphoto2 的 JNA 绑定(在 Eclipse 上使用 Java,在 Ubuntu 上使用 none,我是害怕的)。我想使用的有问题的绑定在这里: http://angryelectron.com/projects/libgphoto2-jna/

我按照该页面上描述的步骤进行了操作,并制作了一个简单的测试客户端,但由于上述错误而失败。所以我减少了测试客户端,直到我尝试做的唯一一件事就是实例化一个 GPhoto2 对象,它仍然产生了错误。测试客户端如下所示:

import com.angryelectron.gphoto2.*;

public class test_class 
{
    public static void main(String[] args)
    {
        GPhoto2 cam = new GPhoto2();
    }

}

我遇到的错误要多得多space:

Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/jna/Structure
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
    at java.net.URLClassLoader.access0(URLClassLoader.java:73)
    at java.net.URLClassLoader.run(URLClassLoader.java:368)
    at java.net.URLClassLoader.run(URLClassLoader.java:362)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at test_class.main(test_class.java:12)
Caused by: java.lang.ClassNotFoundException: com.sun.jna.Structure
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 13 more

libgphoto2 本身已安装,它 运行 从命令行安装,我什至有开发头文件并且可以从 python 调用 GPhoto2 函数,因此无法定位问题那里。

然而,当查看 Eclipse 中的 .class 文件时,它们没有任何定义。所以我认为这可能是问题所在,特别是因为在使用 ant 构建整个东西时出现错误(尽管 .jar 已成功导出,但从我可以看出的错误仅与文档的生成有关)。 所以我将源代码加载到 eclipse 中并自己构建了 .jar。在这种情况下,Eclipse 表示在构建期间存在警告(尽管没有错误),但没有向我显示实际的警告。如果有人能告诉我构建日志到底去了哪里,那可能已经有所帮助。我到处搜索都没有成功,如果我在 eclipse 中单击 "details",它只会告诉我警告发生的位置,而不是它们是什么。

尽管如此,警告不一定是毁灭性的,所以我将生成的 Jar 导入到上述客户端中。我检查了 .class 文件,这次它们包含了所有代码。但我仍然得到完全相同的错误列表(是的,我非常确定旧库已从 class 路径中删除并添加了新库。我重复了这个过程几次,以防万一)。

因为我没有构建 jar 的经验,所以我制作了一个小的 helloworld jar,只是想看看我是否可以从另一个程序调用它,或者我是否会遇到类似的错误。它工作顺利。我什至试图通过使用各种选项导出它来故意重现该问题,但它仍然有效。我尝试使用实验期间有效的设置重新导出我实际需要的库,但它们仍然不会 运行。我现在几乎被困住了。任何能帮助我解决问题的提示都将不胜感激。

您使用的 java 是什么版本 com/sun/jna/Structure 可能只适用于某些 JVM。

一般来说,Java 平台之外的 sun. 等软件包在 OS 平台(Solaris、Windows、 Linux、Macintosh 等)并且可以随时更改,恕不另行通知 SDK 版本(1.2、1.2.1、1.2.3 等)。包含直接调用 sun 的程序。 程序包不是 100% 纯的 Java。

更多详情here

除了@Paul Whelan 所说的。直接拿到丢失的jar可能运气会好些。

获取缺少的库 here,设置类路径,然后重新 运行 应用程序,看看它是否 运行 正常。

你的 jar 需要一个 MANIFEST.MF 来告诉你的应用程序库在哪里。在 eclipse 的项目根目录中创建文件并添加以下行:

Manifest-Version: 1.0
Class-Path: <PATH_TO_LIB__CAN_BE_RELATIVE>.jar       // e.g Class-Path: ../test.jar
<empty line>

在 Eclipse 中右键单击您的项目,转到 Export->next->next->next->Use existing manifest from workspace,select 然后点击完成。这应该有效。

另一种解决方案是使用 Maven 将 类 编译到 jar 本身。