来自终端

时间:2016-01-11 21:47:48

标签: java java-native-interface noclassdeffounderror classnotfoundexception

我正在使用安装了Ubuntu的云虚拟机。安装的Java版本是:

  

java版" 1.8.0_66"
  Java(TM)SE运行时环境(版本1.8.0_66-b17)
  Java HotSpot(TM)64位服务器VM(版本25.66-b17,混合模式)

我从未使用过终端来编译和运行程序。但是,该程序使用Eclipse。

编译我的java程序时,我必须使用两个jar:disco-2.1.jarsqlite-jdbc-3.8.11.2.jar。我使用的终端命令是:

javac -cp '/home/ubuntu/workspace/sem/*' USem.java

使用/home/ubuntu/workspace/sem/*将disco和sqlite jar添加到类路径中。

这会在USem.class目录中创建我的sem文件,没有错误。这些jar包含在sem目录中。

USem.java包含这部分代码,从头开始:

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.apache.lucene.index.CorruptIndexException;

import de.linguatools.disco.CorruptConfigFileException;
import de.linguatools.disco.DISCO;
import de.linguatools.disco.TextSimilarity;
import de.linguatools.disco.DISCO.SimilarityMeasure;

public class USem {

//irrelevant code here

public static void main(String[] args) throws IOException, CorruptConfigFileException, SQLException{

当我在终端中运行时,问题就开始了:

java USem

终端告诉我:

  

错误:发生了JNI错误,请检查您的安装和   再次尝试线程中的异常" main" java.lang.NoClassDefFoundError:   德/ linguatools /迪斯科/ CorruptConfigFileException            at java.lang.Class.getDeclaredMethods0(Native Method)            at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)            at java.lang.Class.privateGetMethodRecursive(Class.java:3048)            在java.lang.Class.getMethod0(Class.java:3018)            在java.lang.Class.getMethod(Class.java:1784)            at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)            在sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)   引起:java.lang.ClassNotFoundException:   de.linguatools.disco.CorruptConfigFileException            at java.net.URLClassLoader.findClass(URLClassLoader.java:381)            at java.lang.ClassLoader.loadClass(ClassLoader.java:424)            at sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:331)            at java.lang.ClassLoader.loadClass(ClassLoader.java:357)            ......还有7个

我认为disco-2.1.jar存在问题。我检查了它中包含的jar类,一切正常。

我的工作空间组织如下:

home/ubuntu/workspace/sem

sem目录中,我有.java个文件,并在那里添加了.jar个文件。

我做错了什么?我尝试卸载JDK并重新安装它,更改运行命令的终端文件夹,但没有任何改变。

- 更新 -

现在我写了

java -cp '/home/ubuntu/workspace/sem/*' USem

然而,我获得了

  

错误:无法找到或加载主类USem

4 个答案:

答案 0 :(得分:1)

在执行java命令时将Disco jar(或任何其他必需的jar)添加到类路径

asar

答案 1 :(得分:0)

没有-classpath参数且没有CLASSPATH环境变量的默认类路径为.。现在,当您的类文件位于工作目录中并且调用java USem时,Java会找到您的类,而不是其他jar文件中的类,因为它们不在类路径中。

添加-cp '/home/ubuntu/workspace/sem/*'时,Java会在jar文件中找到这些类。但这也会覆盖默认的类路径,因此.不再存在,因此Java不再找到自己的类。您需要再次明确添加.(或/home/ubuntu/workspace/sem):-cp '.:/home/ubuntu/workspace/sem/*'

答案 2 :(得分:0)

您的所有评论都很有用。我想发布我的解决方案 我宣布了CLASSPATH环境

export CLASSPATH=/home/ubuntu/workspace/sem/disco-2.1.jar:**other paths for other external jars**:.

我搬进了工作区并编译了.class文件

javac -cp 'sem/*' sem/USem.java

然后我进入sem并运行

java USem

并且工作了。

答案 3 :(得分:0)

移动jre/lib/ext文件夹中的所有必需的jar,然后只需运行命令
java文件名 为我工作!