最近,我一直在玩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?");
}
}
提前致谢。
答案 0 :(得分:3)
我认为您遗失了Google collections,现在称为Guava。
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>