Java: как использовать стороннюю библиотеку?

Код показывает компиляцию с триггером -cp, но не работает. Судя по всему, он не может найти HashMultimap. Проблема с путями к классам?

$ 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 для MultiMap.


person hhh    schedule 05.04.2010    source источник
comment
опубликуйте источник в своем multitest.java здесь в качестве обновления вашего исходного вопроса.   -  person    schedule 05.04.2010


Ответы (3)


Пакеты в Java не связаны иерархически в отношении импорта и компиляции — например, вы не можете импортироватьcom.google.collections.*, импортируя com.*.

Пакеты в библиотеке коллекций, которые вы упомянули:

com.google.common.core.*

com.google.common.annotations.*

com.google.common.collect.*

Попробуйте явно импортировать эти пакеты. Если вы используете такую ​​IDE, как Eclipse, она может отсортировать все ваши операторы импорта за вас.


В ответ на обновление: -cp переопределяет ваш путь к классам. Вам нужно будет включить текущий каталог, чтобы сохранить класс, который вы написали, в пути к классам, поэтому, предполагая, что вы работаете в каталоге со своим классом, установите путь к классам следующим образом java -cp .:google-collect-1.0.jar MultiThing

person brabster    schedule 05.04.2010
comment
Если вы используете такую ​​IDE, как Eclipse, она может отсортировать все ваши операторы импорта за вас. ... вот почему java умирает. - person Ray Foss; 11.09.2020

В дополнение к тому, что было сказано о добавлении JAR в ваш путь к классам: я не использовал коллекции Google, но я очень сомневаюсь, что они помещают свои классы в пакет под названием com.

Вы должны знать, что для вложенных пакетов import level1.* не будет импортировать ни один из классов в пакете level1.level2.

Итак, для вашего примера вам нужно будет изменить import com.* на import com.google-collections.whateverpackageyouneed.*. Изменить в соответствии с API коллекций Google.

person danben    schedule 05.04.2010

Обычно вы получаете сторонний пакет в виде jar-файла (java-архива), а затем добавьте его в путь к классам во время компиляции и выполнения процесса Java.

Синтаксис для этого немного отличается в Unix и в Windows. Если вы работаете с IDE, такой как Eclipse, есть разные способы добавить банку в сборку.

Если вы используете коллекции Google, у вас должен быть jar-файл в загруженном вами zip-файле. Что-то вроде google-collect*.jar

Обновление: похоже, OP изменил вопрос

person Uri    schedule 05.04.2010