簡體   English   中英

javac編譯文件和jar,但是java失敗

[英]javac compiles files and jars but java fails

我已經將.java文件放在一個文件夾(例如/opt/program/並將一個.jar文件放在主文件夾(例如/opt/program/lib/jsoup-1.10.3.jar的lib文件夾中。 然后我運行這些命令

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

我該如何解決?

您可以使用classpath設置編譯類:

javac -classpath lib/*jar *.java 

但是您不要使用classpath設置來啟動可運行類:

java TheFrame

此外, . 並且在設置類路徑文檔中未指定擴展名.jar來設置帶通配符的類路徑。

類路徑條目可以包含基本名稱通配符,該通配符被認為等同於指定擴展名為.jar或.JAR的目錄中所有文件的列表。 例如,類路徑條目foo /指定目錄foo中的所有JAR文件。 僅由*組成的類路徑條目將擴展為當前目錄中所有jar文件的列表

包含*的類路徑條目將與類文件不匹配。 要在單個目錄foo中匹配類和JAR文件,請使用foo; foo / *或foo / *; foo。 選擇的順序確定是否在foo中的JAR文件之前加載foo中的類和資源,反之亦然。

子目錄不是遞歸搜索的。 例如,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:\\ repo \\ commons-lang3 \\ 3.1 \\ commons-lang3-3.1-sources.jar

javac -cp D:\repo\commons-lang3\3.1\* MyClass.java

編譯很好。

我與java命令的行為完全相同。

您不僅需要在編譯時,而且需要在運行時將庫jar放在類路徑中,就像上面一樣。 有關詳細信息,請參見http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/classpath.html

java -classpath lib/*jar TheFrame

應該做到這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM