通过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类的路径

java - java.lang.NoClassDefFoundError(Java,Eclipse,Fuse-JNA,Ubuntu)-LMLPHP


我添加了/ main文件夹

java - java.lang.NoClassDefFoundError(Java,Eclipse,Fuse-JNA,Ubuntu)-LMLPHP


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

@ViktorK。感谢您的帮助,

通过将com.sun.jna»jna下载并添加到referece库中,可以修复上述错误

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

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)


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



我认为我下载的不是可移植的,

在保险丝-jna的临时文件夹中

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

有jna3.5.2类,我将其导入了libraray,现在可以正常使用了。

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

最佳答案

问题不在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),而不是手动依赖关系解决。

另一种方法是下载具有所有依赖项的保险丝罐-如果您认为它是唯一需要的库。但是,如果您以后再添加其他依赖项,则添加具有依赖项的jar可能会导致严重的灾难。这可能导致依赖冲突,这很难发现问题。

关于java - java.lang.NoClassDefFoundError(Java,Eclipse,Fuse-JNA,Ubuntu),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20819024/

10-12 21:07