Eclipse上的Java构建路径错误

时间:2014-04-29 19:28:27

标签: java eclipse noclassdeffounderror classnotfoundexception

最近,我一直在玩Java中的依赖注入。我是这个领域的一个完整的新手,我真的不明白,为什么在这个简单的例子中我一直收到错误。

package michal.dependency;

import com.google.inject.Guice;
import com.google.inject.Injector;

public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Injector injector = Guice.createInjector(new ProjectModule());
        Person person = injector.getInstance(Person.class);
        person.greetFriend();
    }

}

我收到的错误消息如下:

Exception in thread "main" java.lang.NoClassDefFoundError: com/google/common/collect/ImmutableList
at com.google.inject.internal.Errors.<clinit>(Errors.java:656)
at com.google.inject.internal.InternalInjectorCreator.<init>(InternalInjectorCreator.java:62)
at com.google.inject.Guice.createInjector(Guice.java:96)
at com.google.inject.Guice.createInjector(Guice.java:73)
at com.google.inject.Guice.createInjector(Guice.java:62)
at michal.dependency.Main.main(Main.java:14)
Caused by: java.lang.ClassNotFoundException: com.google.common.collect.ImmutableList
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 6 more

我非常肯定必要的.jar文件包含在类路径中。

根据要求提供了所请求的Person类:

package michal.dependency;

import com.google.inject.Inject;

public class Person {

    private MessageService messageService;

    @Inject
    public Person (MessageService messageService)
    {
        this.messageService = messageService;
    }


    public void greetFriend ()
    {
        messageService.sendMessage("Hey!", "How are you?");
    }

}

提前致谢。

2 个答案:

答案 0 :(得分:3)

我认为您遗失了Google collections,现在称为Guava

See Google Guice Wiki

JSR 330

Guice 4.0在您的类路径中需要JSR 330。这是guice下载中包含的javax.inject.jar。 的 com.google.inject.internal

c om.google.inject.internal内的许多内容已更改和/或移动。对于重新打包的Guava(以前称为Google Collections),cglib和asm类尤其如此。现在,所有这些类都隐藏在IDE自动导入建议中,并且位于新位置。如果您依赖任何这些类,则必须更新代码。

答案 1 :(得分:1)

正如其他人所说,似乎你的类路径中缺少某些东西。 也许你可以尝试使用某种依赖管理工具,例如Apache Maven

它是处理依赖关系的一个很好的工具,在java世界中广泛使用。根据您的IDE,您将有很多支持使用它(我个人最喜欢的是Intellij Idea,非常棒的maven支持,尽管Netbeans也做得很好)。

我尝试准备一个maven pom.xml文件,它看起来应该是这样的。我用这个测试了项目,没有编译错误:

  <?xml version="1.0" encoding="UTF-8"?>
  <project xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>groupId</groupId>
<artifactId>test-project</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
    <dependency>
        <groupId>com.google.inject</groupId>
        <artifactId>guice</artifactId>
        <version>3.0</version>
    </dependency>
</dependencies>


</project>