我已将.java
个文件放在一个文件夹中,例如主文件夹内的lib文件夹中的/opt/program/
和.jar
文件,例如/opt/program/lib/jsoup-1.10.3.jar
。然后我运行了这些命令
javac -classpath lib/*jar *.java # compile is OK
java TheFrame # program runs
在其中一个java文件中,例如Tester.java
,我使用了jsoup-1.10.3.jar
中定义的对象。像这样的东西
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
public class Tester {
Document doc;
public Tester() { }
public void doConnect(String name) throws Exception
{
doc = Jsoup.connect("http://somewhere.com").get();
...
}
}
在运行时期间,当遇到Jsoup.connect
时,我收到此错误
java.lang.NoClassDefFoundError
更新:
正如所建议的,我还必须在java命令中包含jar文件。我这样做但仍然得到同样的错误
$ ls lib/
jsoup-1.10.3.jar
$ /opt/jdk1.8.0_131/bin/javac -classpath lib/*.jar *.java
$ /opt/jdk1.8.0_131/bin/java -classpath .:lib/*.jar TheFrame
phase_1
java.util.concurrent.ExecutionException: java.lang.NoClassDefFoundError: org/jsoup/Jsoup
at java.util.concurrent.FutureTask.report(FutureTask.java:122)
at java.util.concurrent.FutureTask.get(FutureTask.java:192)
at javax.swing.SwingWorker.get(SwingWorker.java:602)
at TheFrame$10.propertyChange(TheFrame.java:481)
at java.beans.PropertyChangeSupport.fire(PropertyChangeSupport.java:335)
....
Caused by: java.lang.NoClassDefFoundError: org/jsoup/Jsoup
at Tester.connectForTranscript(Tester.java:24)
at ExcelFile.analyzeSeq(ExcelFile.java:706)
at TheFrame$9.doInBackground(TheFrame.java:448)
....
Caused by: java.lang.ClassNotFoundException: org.jsoup.Jsoup
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
....
Caused by: java.lang.NoClassDefFoundError: org/jsoup/Jsoup
at Tester.doConnect(Tester.java:24)
...
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.ClassNotFoundException: org.jsoup.Jsoup
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 10 more
我该如何解决?
答案 0 :(得分:2)
使用类路径集编译您的类:
javac -classpath lib/*jar *.java
但是你没有使用类路径设置启动runnable类:
java TheFrame
此外,Setting the class path documentation中未指定.
和扩展名.jar
来设置带通配符的类路径。
类路径条目可以包含基本名称通配符, 这被认为等同于指定所有文件的列表 在扩展名为.jar或.JAR的目录中。例如, 类路径条目foo / 指定名为的目录中的所有JAR文件 FOO。 简单地由*组成的类路径条目扩展为所有的列表 当前目录中的jar文件。
包含*的类路径条目与类文件不匹配。至 将类和JAR文件匹配在一个目录foo中,使用其中一个 foo; foo / *或foo / *; foo。选择的顺序决定了 foo中的类和资源在foo中的JAR文件之前加载,或者 反之亦然。
不会递归搜索子目录。例如,foo / *看起来 对于仅在foo中的JAR文件,而不是在foo / bar,foo / baz等中
如果您的所有jar都位于lib文件夹的根目录下,这可以解决您的问题:
java -classpath .:lib/* TheFrame
要编译您的类,您应该使用相同的synthax来设置类路径 令人惊讶的是,执行时没有编译错误:
javac -classpath lib/*jar *.java
我试过了:
javac -cp D:\repo\commons-lang3\3.1\*jar MyClass.java
我收到javac
错误:
javac:无效标志: d:\回购\公地lang3 \ 3.1 \公地lang3-3.1-sources.jar
用
javac -cp D:\repo\commons-lang3\3.1\* MyClass.java
汇编很好。
我与java
命令的行为完全相同。
答案 1 :(得分:1)
您需要将库jar放在类路径中,不仅在编译时,而且在运行时也是如上所述。有关详细信息,请参阅http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/classpath.html。
# find / -size +10M
应该做的伎俩。