【问题标题】:java.lang.NoClassDefFoundError (Java, Eclipse, Fuse-JNA, Ubuntu)java.lang.NoClassDefFoundError(Java、Eclipse、Fuse-JNA、Ubuntu)
【发布时间】:2014-01-16 03:03:50
【问题描述】:

通过 Eclipse,我正在尝试运行 fuse-jna 的文件系统 (HelloFS.java) 的内置示例,但它给了我 java.lang.NoClassDefFoundError 。

我的源项目在 /home/syed/workspace/HelloFS

fuse-jna 类文件位于 home/syed/Downloads/fuse-jna-master/build/classes/main/net/fusejna

在 Eclipse 中,我通过 buildpath 添加了类文件夹,并在环境文件中添加了 jre 路径。我在下面附上了快照。

请帮我在 eclipse 中运行这个例子。

错误:

Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/jna/Structure
    at net.fusejna.FuseFilesystem.mount(FuseFilesystem.java:545)
    at net.fusejna.FuseFilesystem.mount(FuseFilesystem.java:550)
    at HelloFS.main(HelloFS.java:22)
Caused by: java.lang.ClassNotFoundException: com.sun.jna.Structure
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    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)
    ... 3 more

这是内置示例文件系统的代码(没有红色下划线,我认为这意味着 eclipse 构建路径输入正确,):

import java.io.File;
import java.nio.ByteBuffer;

import net.fusejna.DirectoryFiller;
import net.fusejna.ErrorCodes;
import net.fusejna.FuseException;
import net.fusejna.StructFuseFileInfo.FileInfoWrapper;
import net.fusejna.StructStat.StatWrapper;
import net.fusejna.types.TypeMode.NodeType;
import net.fusejna.util.FuseFilesystemAdapterFull;

public class HelloFS extends FuseFilesystemAdapterFull
{
    public static void main(String args[]) throws FuseException
    {
        /*if (args.length != 1) {
            System.err.println("Usage: HelloFS <mountpoint>");
            System.exit(1);
        }*/
        new HelloFS().log(true).mount("./testfs1");
    }

    private final String filename = "/hello.txt";
    private final String contents = "Hello World!\n";

    @Override
    public int getattr(final String path, final StatWrapper stat)
    {
        if (path.equals(File.separator)) { // Root directory
            stat.setMode(NodeType.DIRECTORY);
            return 0;
        }
        if (path.equals(filename)) { // hello.txt
            stat.setMode(NodeType.FILE).size(contents.length());
            return 0;
        }
        return -ErrorCodes.ENOENT();
    }

    @Override
    public int read(final String path, final ByteBuffer buffer, final long size, final long offset, final FileInfoWrapper info)
    {
        // Compute substring that we are being asked to read
        final String s = contents.substring((int) offset,
                (int) Math.max(offset, Math.min(contents.length() - offset, offset + size)));
        buffer.put(s.getBytes());
        return s.getBytes().length;
    }

    @Override
    public int readdir(final String path, final DirectoryFiller filler)
    {
        filler.add(filename);
        return 0;
    }
}

这是环境文件内容:

    PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
    JAVA_HOME="/usr/lib/jvm/java-6-openjdk-i386"

这是 fuse-jna 类路径

我添加了 /main 文件夹

================================================ =========

@Viktor K。感谢您的帮助,

上述错误已通过下载并添加 com.sun.jna » jna 到参考库修复

但现在它向我显示了新的错误

Dec 28, 2013 1:18:25 PM HelloFS getName
INFO: Method succeeded. Result: null
Dec 28, 2013 1:18:25 PM HelloFS getOptions
INFO: Method succeeded. Result: null
Exception in thread "main" java.lang.NoSuchMethodError: com.sun.jna.Platform.getOSType()I
at net.fusejna.Platform.init(Platform.java:39)
at net.fusejna.Platform.fuse(Platform.java:26)
at net.fusejna.FuseJna.init(FuseJna.java:113)
at net.fusejna.FuseJna.mount(FuseJna.java:172)
at net.fusejna.FuseFilesystem.mount(FuseFilesystem.java:545)
at net.fusejna.FuseFilesystem.mount(FuseFilesystem.java:550)
at HelloFS.main(HelloFS.java:22)

================================================ ========

我认为我下载的那个不适合,

在fuse-jna的临时文件夹中

/home/syed/Downloads/fuse-jna-master/build/tmp/expandedArchives/jna-3.5.2.jar_r4n26u14up0smlb84ivcvfnke/

有 jna3.5.2 类,我将它导入到图书馆,现在它工作正常。

我的问题解决了。非常感谢。

【问题讨论】:

    标签: java eclipse ubuntu filesystems fuse


    【解决方案1】:

    问题不在 Fuse-JNA 库中。 Fuse-JNA 库显然依赖于 jna 库(可以在公共 maven 存储库http://mvnrepository.com/artifact/com.sun.jna/jna 中找到)。您需要将此库添加为项目中的依赖项。您可以看到在您项目的引用库中没有可用的 com.sun.jna 包。

    一般情况下 - 如果您想使用包 A(在您的情况下为 Fuse-JNA)并且包 A 依赖于包 B(在您的情况下为 JNA),您必须自己添加 JNA 包作为项目的依赖项。一般来说,很难找出您想要使用的包的所有必需依赖项 - 因此许多项目正在使用 maven(或任何替代品,如 gradle)。如果您想了解更多信息,请查看此:Why maven? What are the benefits?。我强烈建议使用依赖解析工具(如 maven)而不是手动依赖解析。

    另一种方法是下载一个包含所有依赖项的 fuse jar - 如果您认为它是您需要的唯一库。但是,如果您稍后添加其他依赖项,则添加带有依赖项的 jar 可能会导致大灾难。这可能会导致依赖冲突,这很难找到问题。

    【讨论】:

    • 嗯,我认为我下载的那个不是可移动的,在 fuse-jna /home/syed/Downloads/fuse-jna-master/build/tmp/expandedArchives/jna-3.5 的临时文件夹中。 2.jar_r4n26u14up0smlb84ivcvfnke/ 有 jna3.5.2 类,我将它导入到图书馆,现在它工作正常。我的问题解决了。非常感谢。
    猜你喜欢
    • 2010-12-18
    • 2013-06-05
    • 1970-01-01
    • 2015-10-12
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    • 1970-01-01
    相关资源
    最近更新 更多