3

该代码显示使用 -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。

4

3 回答 3

7

就导入和编译而言,Java 中的包在层次上并不相关——例如,您不能通过com.google.collections.*importing 来导入com.*

您提到的集合库中的包是:

com.google.common.core.*

com.google.common.annotations.*

com.google.common.collect.*

尝试显式导入这些包。如果您使用的是 Eclipse 之类的 IDE,它可以为您整理出所有的导入语句。


响应更新: -cp 覆盖您的类路径。您需要包含当前目录以将您编写的类保留在类路径中,因此假设您正在与您的类一起在目录中运行,请按如下方式设置类路径java -cp .:google-collect-1.0.jar MultiThing

于 2010-04-05T16:47:42.373 回答
1

您通常将第 3 方包作为 jar 文件(java 存档)获取,然后在编译期间和执行 Java 进程时将其添加到您的类路径中

执行此操作的语法在 Unix 和 Windows 中略有不同。如果您使用 Eclipse 之类的 IDE,则可以通过多种方式将 jar 添加到构建中。

如果您使用的是 Google 收藏,您下载的 zip 文件中应该有一个 jar。像 google-collect*.jar 这样的东西

更新:看起来OP修改了问题

于 2010-04-05T16:40:39.427 回答
1

除了关于将 JAR 添加到类路径中所说的话:我没有使用过 Google Collections,但我非常怀疑他们将他们的类放在一个名为com.

您应该知道,对于嵌套包,import level1.*不会导入 package 中的任何类level1.level2

因此,对于您的示例,您需要更改import com.*import com.google-collections.whateverpackageyouneed.*. 根据 Google Collections API 进行修改。

于 2010-04-05T16:47:07.553 回答