我正在使用安装了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.jar
和sqlite-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
答案 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文件名
为我工作!