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

问题描述

问题说明

我最近一直在尝试将 Apache Jena 与 Java 结合使用(而不是在命令行上)。我写了一个简单的脚本来转换读写不同的RDF格式类型,所以

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 是一个包含 81 个四边形的测试 nquads 文件

我是这样调用的:

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

它编译没有错误,但是当我运行它时,它返回一个错误

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

我尝试了什么

我环顾四周,发现这个错误几乎总是发生,因为没有包含必要的 .jar 文件,因此无法加载代码引用的类。这些其他问题的解决方案是包含所有 /apache-jena-3.17.0/lib/* 。奇怪的是,这对我不起作用——我确实在我的类路径中包含了 lib/ 的所有内容,但我仍然看到错误

系统说明

我正在运行 Jena 3.17.0,使用此处提供的认 Linux 二进制文件 (https://jena.apache.org/download/index.cgi)。我没有添加删除任何其他 Jena 模块。

我在带有 Ubuntu 20.04 的 Windows 子系统 Linux(版本 2)中运行它。

如果你们中的任何人对可能导致这种情况的原因有任何见解,我将不胜感激!

解决方法

根据 vvs 的评论,链接 https://howtodoinjava.com/java-examples/set-classpath-command-line/ 很有帮助。有两个问题:我需要在 java 命令中包含类路径,而不仅仅是 javac。我还需要包含 javac 输出所在的当前目录。

我通过设置 CLASSPATH 变量来解决这个问题,然后将所有需要的目录添加到该变量中。 (您也可以通过将类路径添加到 -cp 参数中来做到这一点)。请注意:分隔不同的目录。

简而言之,这就是我所做的:

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

注意每次打开新终端都需要重新分配CLASSPATH。