2010-04-05 129 views
3

代碼顯示了-cp扳機,但沒有運行編譯。顯然,它找不到HashMultimap。類路徑問題?Java:如何使用第三方庫?

$ javac -cp google-collect-1.0.jar MultiThing.java 
$ java -cp google-collect-1.0.jar MultiThing 
Exception in thread "main" java.lang.NoClassDefFoundError: MultiThing 
Caused by: java.lang.ClassNotFoundException: MultiThing 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:319) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:264) 
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:332) 
Could not find the main class: MultiThing. Program will exit. 
$ cat MultiThing.java 
import java.io.*; 
import java.util.*; 
import com.google.common.annotations.*; 
import com.google.common.collect.*; 

public class MultiThing { 
    public static void main(String[] args) { 
     Multimap<String, String> wordToFiles = HashMultimap.create(); 
     wordToFiles.put("first", "HELLO"); 
     wordToFiles.put("first", "HALLO"); 
     for (String thing : wordToFiles.get("first")){ 
      System.out.println(thing); 
     } 
    } 
} 
$ ls 
google-collect-1.0.jar MultiThing.class com  MultiThing.java 

API for MultiMap.

+0

將源發佈到您的multitest。 Java在這裏作爲你原來的問題的更新 – 2010-04-05 17:53:03

回答

6

就Java的導入和編譯而言,Java中的包不是分層相關的 - 例如,您不能通過導入com.*導入com.google.collections.*

在你提到的集合庫的包:

com.google.common.core.*

com.google.common.annotations.*

com.google.common.collect.*

嘗試明確導入這些軟件包。如果您使用Eclipse之類的IDE,則可以爲您整理所有導入語句。


針對更新: -cp覆蓋類路徑中。您需要包含當前目錄以保留您在類路徑中寫入的類,因此假設您正在類中運行目錄,請按如下方式設置類路徑:java -cp .:google-collect-1.0.jar MultiThing

1

你通常得到第三方包作爲一個jar文件(Java歸檔),然後add it to your classpath during compilation and while executing the Java process

這樣做的語法是在Unix和Windows中略有不同。如果您使用Eclipse之類的IDE,則可以使用不同的方式將jar添加到構建中。

如果您在使用谷歌的集合,你應該在你下載的zip文件罐。像谷歌,收集的* .jar

更新:看起來像OP修訂問題

1

除了說了些什麼有關將JAR到類路徑中:我沒有使用谷歌集合,但我非常懷疑他們將自己的課程放在名爲com的套餐中。

您應該知道,對於嵌套包,import level1.*不會導入包level1.level2中的任何類。

所以你的例子,你將需要改變import com.*import com.google-collections.whateverpackageyouneed.*。根據Google Collections API進行修改。