简体   繁体   中英

Apache Jena: Error: “java.lang.NoClassDefFoundError: org/apache/jena/riot/RDFDataMgr”

Problem explanation

I have recently been trying to use Apache Jena with Java (rather than on the command line). I wrote a simple script to convert read and write differetn RDF format types, as so

import org.apache.jena.riot.RDFDataMgr;
import org.apache.jena.query.Dataset;
import org.apache.jena.riot.Lang;

public class Go_NT
{
    public static void main(String[] args)
    {
        Dataset dataset = RDFDataMgr.loadDataset("triail.nq");
        RDFDataMgr.write(System.out, dataset, Lang.NTRIPLES);
    }
}

triail.nq is a test nquads file containing 81 quads.

I invoked it as so:

javac -cp "/mnt/e/Tráchtas/apache-jena-3.17.0/lib/*" Go_NT.java
java Go_NT

It compiles without error, but when I run it, it returns an error

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/jena/riot/RDFDataMgr
        at Go_NT.main(Go_NT.java:9)
Caused by: java.lang.ClassNotFoundException: org.apache.jena.riot.RDFDataMgr
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
        ... 1 more

What I have tried

I have looked around and seen that this error occurs almost always because a necessary.jar file is not included, so a class referenced by the code cannot be loaded. The solution to these other issues was to include all of /apache-jena-3.17.0/lib/*. Oddly enough, that has not worked for me--I do include all of the contents of lib/ in my classpath, but I am still seeing the error.

System notes

I am running Jena 3.17.0, using the default Linux binaries available here ( https://jena.apache.org/download/index.cgi ). I have not added or removed any other Jena modules.

I am running this in the Windows Subsystem for Linux (version 2) with Ubuntu 20.04.

If any of you have any insight into what could be causing this, I would greatly appreciate it!

Based on the comment by vvs, the link https://howtodoinjava.com/java-examples/set-classpath-command-line/ helped out a lot. There were 2 issues: I needed to include the classpath in the java command, not just javac. I also needed to include the current directory where the output of javac would be.

I fixed this by setting the CLASSPATH variable, and then adding all the needed directories to that. (You could also do this by adding the classpath into the -cp argument). Note that the: separates different directories.

In short, here is what I did:

export CLASSPATH=/mnt/e/Tráchtas/apache-jena-3.17.0/lib/*:.
javac Go_NT.java
java Go_NT

Note that you need to re-assign CLASSPATH each time you open a new terminal.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM