2016-05-16 75 views
1

我想在我的gwt應用程序中添加dagger2來使用DI。到目前爲止我按照以下步驟如何將dagger2整合到GWT應用程序中?

1)增加了以下依賴性在pom.xml

<dependency> 
     <groupId>com.google.dagger</groupId> 
     <artifactId>dagger-gwt</artifactId> 
     <version>2.4</version> 
    </dependency> 

    <dependency> 
     <groupId>com.google.dagger</groupId> 
     <artifactId>dagger-compiler</artifactId> 
     <version>2.4</version> 
    </dependency> 

    <dependency> 
     <groupId>com.google.auto.factory</groupId> 
     <artifactId>auto-factory</artifactId> 
     <version>1.0-beta3</version> 
    </dependency> 

2)加入的代碼下面的行中的繼承GWT模塊MyApp.gwt.xml匕首依賴性。

<inherits name="dagger.Dagger" /> 

3)創建組件類。

import javax.inject.Singleton; 
import com.google.gwt.event.shared.EventBus; 
import dagger.Component; 

@Singleton 
@Component(modules = AppModule.class) 
public interface AppComponent { 

    EventBus eventBus(); 
} 

4)創建的模塊類

import javax.inject.Singleton; 

import com.google.gwt.event.shared.EventBus; 
import com.google.gwt.event.shared.SimpleEventBus; 

import dagger.Module; 
import dagger.Provides; 

@Module 
public class AppModule { 

    @Provides 
    @Singleton 
    SimpleEventBus provideSimpleEventBus() { 
     return new SimpleEventBus(); 
    } 

    @Provides 
    EventBus provideEventBus(SimpleEventBus bus) { 
     return bus; 
    } 
} 

最後,當我試圖在AppEntryPoint

AppComponent component = DaggerAppComponent.builder()....build(); 

構建模塊,我無法找到生成的類DaggerAppComponentmvn compilemvn gwt:compile之後的任意位置。我從org.codehaus.mojo使用gwt-maven-plugin。它清楚我缺少配置中的東西,但無法弄清楚究竟是什麼。

+0

全設置你告訴我們,'AppComponent',說實在找不到'DaggerChatComponent' ....你是混合的2嗎? –

+0

錯字,現在修復並更新。 – Ajax

+0

是否生成任何源文件? –

回答

2

首先,您需要確保註釋處理器由maven-compiler-plugin觸發。我強烈建議使用maven-compiler-plugin的3.5.1(至少)版本,它修復了許多問題,使得在Maven中使用註釋處理器是非常不切實際的。
使用默認配置,將在target/generated-sources中生成源代碼並添加爲項目源,以便稍後由gwt-maven插件正確拾取源代碼。

您應該將您的dagger-compiler依賴關係更改爲<optional>true</optional><scope>provided</scope>;甚至更好,在maven-compiler-plugin的annotationProcessorPath中聲明它。

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <version>3.5.1</version> 
    <configuration> 
     <source>1.7</source> 
     <target>1.7</target> 
     <annotationProcessorPaths> 
      <path> 
       <groupId>com.google.dagger</groupId> 
       <artifactId>dagger-compiler</artifactId> 
       <version>${dagger.gwt.version}</version> 
      </path> 
     </annotationProcessorPaths> 
    </configuration> 
</plugin> 

對於開發者模式,你需要在每次做出改變的加工類的時間重新運行註釋處理器;這通常由IDE完成,但可以使用命令行mvn compilemvn process-classes來觸發。

你可以看到在我的gwt-maven-archetypes

+0

有實際的代碼片段將有助於前兩個點。回答使我找到確切的命令來生成'mvn compiler:compile'或更完整的類'clean gwt:generateAsync compiler:compile compile' – Ajax

+1

根據經驗,不要從命令行調用直接mojos如果它們綁定到構建中的生命週期階段和/或依賴於之前運行的其他事物(例如生成源)。因此,堅持'mvn compile',它將執行'gwt:generateAsync'(綁定到'generate-sources'生命週期階段)和'compiler:compile'(除了'resources:resources')或'mvn process-類「,它還會運行任何綁定到後期生命週期階段的mojo(它緊接在」compile「階段之後)。至於代碼片段,我在移動設備上,因此無法輕鬆輸入代碼(甚至不是那麼簡單);-) –

+0

它不是早期爲我生成代碼,只需'mvn compile',但現在可能是因爲版本爲'3.5 .1''maven-compiler-plugin'或乾淨的編譯前工作。感謝參考原型,它是真正有用的解決可能的未來麻煩:) – Ajax

相關問題