2016-02-25 17 views
11

Ho testato Dagger 2 e tutto ha funzionato, fino a quando non ho eseguito un po 'di refactoring. Ora gradle sta lanciando uno IllegalArgumentException, e non riesco a capire cosa ho cambiato che sta causando l'errore. Non ho fatto alcuna modifica al file Gradle, e questo sembra essere il peso della traccia dello stack:Dagger 2 Build IllegalArgumentException compileDebugJavaWithJavac

org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':mobile:compileDebugJavaWithJavac'. 
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:69) 
    ... 

Caused by: java.lang.IllegalArgumentException 
    at com.google.common.base.Preconditions.checkArgument(Preconditions.java:108) 
    at dagger.internal.codegen.writer.ClassName.peerNamed(ClassName.java:130) 
    at dagger.internal.codegen.SourceFiles.membersInjectorNameForMembersInjectionBinding(SourceFiles.java:266) 
    at dagger.internal.codegen.InjectBindingRegistry.registerBinding(InjectBindingRegistry.java:194) 
    at dagger.internal.codegen.InjectBindingRegistry.registerBinding(InjectBindingRegistry.java:171) 
    at dagger.internal.codegen.InjectProcessingStep.process(InjectProcessingStep.java:129) 
    at dagger.shaded.auto.common.BasicAnnotationProcessor.process(BasicAnnotationProcessor.java:228) 
    at com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:794) 
    at com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:705) 
    at com.sun.tools.javac.processing.JavacProcessingEnvironment.access$1800(JavacProcessingEnvironment.java:91) 
    at com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1035) 
    at com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1176) 
    at com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1170) 
    at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:856) 
    at com.sun.tools.javac.main.Main.compile(Main.java:523) 
    ... 89 more 

Nessun file vengono generati da Dagger così, ed erano in precedenza. Ho provato tutti i metodi per risolvere questo problema che posso trovare, principalmente per quanto riguarda il fissaggio dei file gradle o la cancellazione della cartella di build, ma finora nulla ha funzionato.


Aggiornamento rapido (poiché ho notato alcuni voti positivi); Non ho mai scoperto cosa ho fatto di sbagliato, ho finito per tornare a una vecchia build. Dopo il ripristino, ho rifatto il refactoring e ha funzionato bene. Devo aver fatto qualcosa di diverso quando ho inizialmente rifatto il codice, ma non ho idea di cosa fosse.

Se qualcuno ha un'idea di cosa potrebbe aver causato questo, sono sicuro che aiuterà tutti coloro che hanno, o lo faranno in futuro, incontrare questo problema.

risposta

11

Mi sono imbattuto in questo problema mentre portava Firebase nel progetto. È stato il primo servizio in background ad essere aggiunto al progetto, quindi ho deciso di fare un po 'di investigazione con un servizio che non ha fatto nulla.

Questa costruzione:

public class HopefullyBuildsService extends IntentService { 
    public HopefullyBuildsService(String name) { 
     super(name); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 

    } 
} 

.............. 

@ApplicationScoped 
@Component(modules = {ApplicationModule.class, RestModule.class}) 
public interface ApplicationComponent { 
    ... 
    void inject(HopefullyBuildsService service); 
    ... 
} 

Ma questo ha causato l'accumulo di fallire:

public class HopefullyBuildsService extends FirebaseMessagingService { 
} 

.............. 

@ApplicationScoped 
@Component(modules = {ApplicationModule.class, RestModule.class}) 
public interface ApplicationComponent { 
    ... 
    void inject(HopefullyBuildsService service); 
    ... 
} 

Per qualsiasi motivo si cerca di iniettare direttamente in un servizio Firebase derivato provoca l'accumulo di fallire nel modo in cui si descritto. Tuttavia, indirettamente iniettando in un'altra classe e quindi istanzialo, il modo antiquato all'interno del servizio gli ha permesso di ricostruire.

public class FirebaseDaggerInjectHelper { 

    @Inject 
    PersistManager persistManager; 

    @Inject 
    RestClient restClient; 

    @Inject 
    OtherClasses stuffEtc; 

    public FirebaseDaggerInjectHelper(MyApplication application){ 
     application.getApplicationComponent().inject(this); 
    } 

    //getters and setters n stuff 
} 

........ 

@ApplicationScoped 
@Component(modules = {ApplicationModule.class, RestModule.class}) 
public interface ApplicationComponent { 
    ... 
    void inject(FirebaseDaggerInjectHelper helper); 
    ... 
} 

........ 

public class HopefullyBuildsService extends FirebaseMessagingService { 
    private FirebaseDaggerInjectHelper injectHelper; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     injectHelper = new FirebaseDaggerInjectHelper((MyApplication) getApplicationContext()); 
} 

E quindi ha costruito bene. Certo, avere questa classe middleman è fastidiosa e il servizio derivato da Firebase deve interagire con i componenti iniettati in modo indiretto. Ma non mi è chiaro perché non posso iniettare in un servizio derivato da Firebase, o cosa è speciale in Firebase che ha reso Dagger2 infelice.

+1

+1 per la vostra soluzione alternativa, era esattamente il mio problema anche con FirebaseMessagingService dopo che ho provato ad iniettare dipendenze in esso. Forse c'è qualche problema con l'offuscamento? – gnuf

+0

Come vorrei che questo potesse essere spiegato dai ragazzi di Firebase e Dagger –

+0

Accade anche quando estendi "FirebaseInstanceIdService". – LEO