通过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文件夹
================================================== ======
@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/