javac编译文件和jar但java失败

时间:2017-07-18 18:12:19

标签: java jsoup

我已将.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

我该如何解决?

2 个答案:

答案 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
应该做的伎俩。

相关问题