2010-04-05 8 views
3

Le code affiche la compilation avec le déclencheur -cp mais ne fonctionne pas. Apparemment, il ne peut pas trouver le HashMultimap. Problème de Classpath?Java: comment utiliser une bibliothèque tierce?

$ 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

publiez la source sur votre multitest. java ici comme une mise à jour à votre question d'origine –

Répondre

6

Les packages Java ne sont pas liés hiérarchiquement en ce qui concerne les importations et la compilation. Par exemple, vous ne pouvez pas importer com.google.collections.* en important com.*.

Les paquets dans la bibliothèque de collections que vous mentionnez sont:

com.google.common.core.*

com.google.common.annotations.*

com.google.common.collect.*

Essayez d'importer ces paquets explicitement. Si vous utilisez un EDI comme Eclipse, il peut trier toutes vos déclarations d'importation pour vous.


En réponse à jour: -cp remplace votre classpath. Vous devez inclure le répertoire courant pour conserver la classe que vous avez écrite sur le chemin de classe, donc en supposant que vous courez dans le répertoire avec votre classe, définissez le chemin de classe comme suit: java -cp .:google-collect-1.0.jar MultiThing

1

En général, vous obtenez le paquet 3ème partie comme un fichier jar (archive Java), puis add it to your classpath during compilation and while executing the Java process.

La syntaxe pour ce faire est légèrement différente sous Unix et sous Windows. Si vous travaillez avec un EDI comme Eclipse, il existe différentes façons d'ajouter un pot à une construction.

Si vous utilisez des collections Google, vous devez disposer d'un fichier jar dans le fichier zip que vous avez téléchargé. Quelque chose comme google-collect * .jar

Mise à jour: Il semble que l'OP a révisé la question

1

En plus de ce qui a été dit sur l'ajout du JAR à votre classpath: Je ne l'ai pas utilisé Collections Google, mais je très doute qu'ils mettent leurs classes dans un paquet appelé com.

Vous devez savoir que pour les packages imbriqués, import level1.* n'importera aucune des classes du package level1.level2. Par conséquent, pour votre exemple, vous devrez remplacer import com.* par import com.google-collections.whateverpackageyouneed.*. Modifier selon l'API Google Collections

Questions connexes