2

최근 자바에서 depency 주입을 조금 해보았습니다. 저는이 분야의 완전한 초보자입니다. 그리고 저는 실제로 얻지 못합니다. 왜이 간단한 예에서 나는 계속 오류를 받아들입니다. 다음과 같이Eclipse에서 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(); 
    } 

} 

I 나타나는 오류 메시지는 다음과 같습니다

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 파일을 클래스 패스에 포함되어있는 방법에 의해 확신 해요. 사전에

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?"); 
    } 

} 

감사 :

여기의 요청에 따라 요청 된 Person 클래스를 온다.

+4

'내가 필요한 .jar 파일을 클래스 패스에 포함되어'컴파일하는 동안 **와 ** 당신의 응용 프로그램을 실행 확신에도 불구하고? http://stackoverflow.com/questions/1457863/what-is-the-difference-between-noclassdeffounderror-and-classnotfoundexception을 살펴보십시오. – Pshemo

+2

확실한 경우 컴파일러가 잘못 되었음이 분명합니다. 그것을 설득하려고 노력하십시오. – perencia

+0

참조 된 라이브러리로 나타나며 프로젝트 속성에서 Order 및 Export의 맨 위에 있습니다. 당신이 사용하고있는 Guice의 버전은 –

답변

3

나는 Guava으로 알려져있는 Google collections이 누락 된 것으로 생각합니다. JSR 330

Guice 4.0

See Google Guice Wiki

는 클래스 패스에 JSR 330를 필요로한다. 이것은 guice 다운로드에 포함 된 javax.inject.jar입니다. C om.google.inject.internal 내부 com.google.inject.internal

많은 것들이 변경 및/또는 이동했다. 재 패키징 된 Guava (이전 Google Collections), cglib 및 asm 클래스의 경우 특히 그렇습니다. 이 모든 클래스는 이제 IDE 자동 가져 오기 제안에서 숨겨지고 새로운 위치에 있습니다. 이러한 클래스 중 하나를 사용하는 경우 코드를 업데이트해야합니다.

+0

그리고 이것이 유효한 지적 일 수 있습니다!초 단위로 확인하겠습니다. –

+0

아니요, 경로에 구아바를 추가했는데 컴파일러가 아직 없습니다. –

+0

경로에 추가했는데 컴파일러가 여전히 소리를 내지 않습니다 :/ –

1

다른 제안처럼 클래스 패스에 뭔가가없는 것 같습니다. 예를 들어 Apache Maven과 같이 일종의 의존성 관리 도구를 사용해 볼 수 있습니까?

이것은 자바 세계에서 광범위하게 사용되는 종속성을 처리하는 훌륭한 도구입니다. 귀하의 IDE에 따라 그것을 사용하여 많은 supportfor 것입니다 (내 개인적인 좋아하는 정말 좋은 메이븐 지원과 Intellij 아이디어이지만, 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> 
+0

감사합니다. 올바른 내용입니다.) –

관련 문제