![](/img/trans.png)
[英]Java generics code compiles with javac, fails with Eclipse Helios
[英]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.