2015-07-23 33 views
24

Oto problem,@Named dostawców z tych samych typów obie skończyć dając java.lang.IllegalArgumentException: Duplikat

Pracuję nad projektem libgdx gdzie mam różnych modułów dla różnych platform.

ten sposób mój moduł android wygląda następująco:

@Module(
    includes = {BaseModule.class, NetModule.class}, 
    injects = {DummyProjectActivity.class, DummyProject.class}, 
    overrides = true) 
public class DummyProjectAndroidModule { 

    ... 

    @Provides @Singleton @Named("DummyOne") 
    DummyInterface provideDummyOne() { 
     return new DummyOne(); 
    } 

    @Provides @Singleton @Named("DummyTwo") 
    DummyInterface provideDummyTwo() { 
     return new DummyTwo(); 
    } 

    @Provides @Singleton @Named("DummyConsumer") 
    DummyConsumer provideDummyConsumer(@Named("DummyOne") DummyInterface dummyOne, 
            @Named("DummyTwo") DummyInterface dummyTwo) { 
     return new DummyConsumer(dummyOne, dummyTwo); 
    } 
} 

.. i tutaj jak mój moduł pulpit wygląda tak:

@Module(
    includes = {BaseModule.class, NetModule.class}, 
    injects = {DummyProjectDesktop.class, DummyProject.class}, 
    overrides = true) 
public class DummyProjectDesktopModule { 

dobrze reszta jest prawie taka sama. Jednak podczas gdy buduję projekt na Pulpit, wszystko idzie dobrze i elegancko, gdzie po stronie Androida dostaję ten błąd, który pozostawia mnie oszołomiony.

Process: net.alicanhasirci.mobile.DummyProject.android, PID: 4603 
    java.lang.RuntimeException: Unable to start activity ComponentInfo{net.alicanhasirci.mobile.DummyProject.android/net.alicanhasirci.mobile.DummyProject.android.DummyProjectActivity}: java.lang.IllegalArgumentException: Duplicate: 
    net.alicanhasirci.mobile.android.image.DummyInterface net.alicanhasirci.mobile.DummyProject.android.DummyProjectAndroidModule.provideDummyOne() 
    net.alicanhasirci.mobile.android.image.DummyInterface net.alicanhasirci.mobile.DummyProject.android.DummyProjectAndroidModule.provideDummyTwo() 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2305) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2365) 
      at android.app.ActivityThread.access$800(ActivityThread.java:148) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1283) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5272) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:909) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704) 
    Caused by: java.lang.IllegalArgumentException: Duplicate: 
    net.alicanhasirci.mobile.android.image.DummyInterface net.alicanhasirci.mobile.DummyProject.android.DummyProjectAndroidModule.provideDummyOne() 
    net.alicanhasirci.mobile.android.image.DummyInterface net.alicanhasirci.mobile.DummyProject.android.DummyProjectAndroidModule.provideDummyTwo() 
      at dagger.internal.UniqueMap.put(UniqueMap.java:29) 
      at dagger.internal.plugins.reflect.ReflectiveModuleAdapter.handleBindings(ReflectiveModuleAdapter.java:104) 
      at dagger.internal.plugins.reflect.ReflectiveModuleAdapter.getBindings(ReflectiveModuleAdapter.java:89) 
      at dagger.ObjectGraph$DaggerObjectGraph.makeGraph(ObjectGraph.java:174) 
      at dagger.ObjectGraph$DaggerObjectGraph.access$000(ObjectGraph.java:132) 
      at dagger.ObjectGraph.create(ObjectGraph.java:129) 
      at net.alicanhasirci.mobile.DummyProject.android.DummyProjectActivity.onCreate(DummyProjectActivity.java:137) 
      at android.app.Activity.performCreate(Activity.java:5977) 
      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2258) 

teraz szybkie spojrzenie na kodzie źródłowym sztylet i widzę, że adnotacje kwalifikacyjne są zbierane przez odbicie i przyzwyczaić jak do wiązania nazw przedrostków, które zostaną później wykorzystane jako klucze w UniqueMap. Mój problem wydaje się pojawić gdzieś wokół tego obszaru, gdzie mój kwalifikator nie zostanie przetworzony w jakiś sposób, ale moim pulpicie build działa bez problemu ...

Oto kilka dodatkowy:

ObjectGraph objectGraph = ObjectGraph.create(new DummyProjectAndroidModule()); 
    objectGraph.inject(this); 
    dp = objectGraph.get(DummyProject.class); 

jest jak ja dostać mój obiekt DummyProject, który ma wtrysk polowy DummyConsumer. Jako takie:

@Inject @Named("DummyConsumer") DummyConsumer consumer; 

Zmieniłem typy powrotów do konkretnych klas jako obejście, ale nikt nie lubi obejście przyczyna wszyscy wiemy, że oni was prześladować do końca.

+4

Zaktualizuj do nowszej wersji Sztyletu. –

Odpowiedz

0

W końcu zorientowałem się, dlaczego występuje ten problem. To jest Proguard. O ile nie określisz inaczej w pliku konfiguracyjnym proguard, spowoduje to zaciemnienie wygenerowanego kodu podczas przycinania adnotacji, a co nie spowoduje nieoczekiwanych rezultatów.

Jedynym sposobem na współistnienie Proguard i Sztyletu jest zasadniczo rezygnacja z większości zaciemniania lub przełączania się na Dagger2, jak powiedział Jake Wharton na https://github.com/square/dagger/issues/202. Używam proguard tylko po to, by uniknąć trafienia w limit 65k, więc tworzenie niezbędnych konfiguracji w celu uniknięcia zaciemniania rozwiązało mój problem.