2016-02-25 13 views
11

Ich habe Dagger 2 getestet, und alles hat funktioniert, bis ich ein bisschen Refactoring gemacht habe. Jetzt wirft Gradle eine IllegalArgumentException, und ich kann nicht herausfinden, was ich geändert habe, dass jetzt den Fehler verursacht. Ich habe keine Änderungen an der gradle Datei vorgenommen, und dies scheint die Hauptlast der Stack-Trace zu sein:Dolch 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 

keine Dateien von Dagger als auch erzeugt werden, und sie waren zuvor. Ich habe jede Methode versucht, um das zu beheben, das ich finden kann, größtenteils mit dem Reparieren der Gradle-Dateien oder dem Löschen des Erstellungsordners, aber bis jetzt hat nichts funktioniert.


Schnelle Aktualisierung (seit ich ein paar Up-Stimmen bemerkt habe); Ich habe nie herausgefunden, was ich falsch gemacht habe, und bin zu einem alten Build zurückgekehrt. Nach dem Zurücksetzen habe ich das Refactoring erneut durchgeführt und es hat gut funktioniert. Ich muss etwas anderes gemacht haben, als ich den Code ursprünglich überarbeitet habe, aber ich habe keine Ahnung, was es war.

Wenn jemand eine Idee davon hat, was das verursacht haben könnte, bin ich mir sicher, dass es jedem anderen helfen wird, der dieses Problem in der Zukunft hat oder in Zukunft haben wird.

Antwort

11

Ich stieß auf dieses Problem, während Firebase in das Projekt gebracht wurde. Es war der erste Hintergrunddienst, der zu dem Projekt hinzugefügt wurde, also beschloss ich, etwas mit einem Dienst zu tun, der nichts tat.

Dieses Jahr:

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); 
    ... 
} 

Aber die Build verursacht scheitern:

public class HopefullyBuildsService extends FirebaseMessagingService { 
} 

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

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

Aus welchem ​​Grunde auch immer direkt in eine Firebase abgeleiteten Dienst bewirkt, dass der Build zu injizieren versucht, in der Art und Weise versagen Sie beschrieben. Aber indirekt in eine andere Klasse zu injizieren und dann die altmodische Art innerhalb des Dienstes zu instantiieren, erlaubte es, wieder zu bauen.

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()); 
} 

Und dann hat es gut gebaut. Zugegebenermaßen ist es lästig, diese Zwischenhändlerklasse zu haben, und der von der Firebase abgeleitete Service muss indirekt mit den injizierten Komponenten interagieren. Aber mir ist nicht klar, warum ich nicht in einen von Firebase abgeleiteten Service einsteigen kann, oder was an Firebase besonders ist, was Dagger2 unglücklich gemacht hat.

+1

+1 für Ihre Problemumgehung, es war genau mein Problem auch mit FirebaseMessagingService, nachdem ich versucht habe, Abhängigkeiten in es zu injizieren. Vielleicht gibt es ein Problem mit der Verschleierung? – gnuf

+0

Wie ich wünschte, dass dies von Firebase und Dagger Jungs erklärt werden könnte –

+0

Kommt vor, wenn Sie "FirebaseInstanceIdService" auch erweitern. – LEO