尝试从jar

时间:2015-09-23 09:54:48

标签: java eclipse jar libgphoto2

我确实发现了很多关于这个错误的内容,但不知怎样,建议的解决方案都没有解决问题。

我正在尝试在Eclipse中的Ubuntu下使用libgphoto2的JNA绑定(在Eclipse上使用Java的经验,在Ubuntu上没有任何一个,我担心)。我想要使​​用的绑定在这里: 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();
    }

}

我得到的错误会占用更多空间:

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.access$100(URLClassLoader.java:73)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
    at java.net.URLClassLoader$1.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声明在构建期间有警告(虽然没有错误),但没有向我显示实际的警告。如果有人能告诉我构建日志到底在哪里,那可能已经有所帮助了。我在所有地方搜索都没有成功,如果我点击日食中的“细节”,它只会告诉我警告发生在哪里,而不是它们是什么。

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

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

3 个答案:

答案 0 :(得分:2)

除了@Paul Whelan所说的。你可以通过直接获得丢失的罐子来获得更好的运气。

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

答案 1 :(得分:1)

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

通常,Java平台之外的sun。等软件包在操作系统平台(Solaris,Windows,Linux,Macintosh等)之间可能会有所不同,并且可能随时更改,恕不另行通知SDK版本(1.2,1.2.1,1.2.3等)。包含对sun。包的直接调用的程序不是100%Pure Java。

更多详情here

答案 2 :(得分:1)

您的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中右键单击您的项目,转到导出 - &gt; next-&gt; next-&gt; next-&gt;使用工作区中的现有清单,选择它并单击完成。这应该有用。

另一个解决方案是使用Maven将类编译到jar中。