问题 Dagger 2 Build IllegalArgumentException compileDebugJavaWithJavac


我一直在测试Dagger 2,一切都在工作,直到我做了一些重构。现在gradle投掷了 IllegalArgumentException,我无法弄清楚我改变了什么,现在导致错误。我没有对gradle文件进行任何更改,这似乎是堆栈跟踪的主要内容:

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

Dagger也没有生成任何文件,而且之前也是如此。我一直在尝试解决这个问题的方法,我可以找到,主要涉及修复gradle文件或清除build文件夹,但到目前为止还没有任何工作。


快速更新(因为我注意到一些上升票);我从未弄清楚我做错了什么,最后我恢复了旧版本。恢复之后,我再次进行了重构,并且工作正常。当我最初重构代码时,我必须做一些不同的事情,但我不知道它是什么。

如果有人知道可能导致这种情况的原因,我相信它会帮助那些已经或将来会遇到这个问题的人。


10592
2018-02-25 14:18


起源



答案:


我在将Firebase引入项目时遇到了这个问题。这是第一个被添加到项目中的后台服务,所以我决定用一项什么都不做的服务做一些调查。

这个建成:

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

但这导致构建失败:

public class HopefullyBuildsService extends FirebaseMessagingService {
}

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

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

无论出于何种原因,尝试直接注入Firebase派生服务会导致构建以您描述的方式失败。然而,间接注入另一个类然后实例化它,服务内部的老式方式允许它再次构建。

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

然后它建好了。不可否认,让这个中间人类很烦人,而firebase派生的服务必须以间接的方式与注入的组件进行交互。但是我不清楚为什么我不能注入Firebase衍生服务,或者Firebase的特殊之处让Dagger2感到不快。


11
2018-06-29 19:09



为您的解决方法+1,在我尝试将依赖项注入其中后,FirebaseMessagingService也是我的问题。混淆可能存在一些问题? - gnuf
我希望Fireben和Dagger家伙可以解释这个问题 - John Ernest Guadalupe
当您扩展“FirebaseInstanceIdService”时也会发生。 - LEO
令人难以置信的是它的原因。是否有关于谷歌广场的问题报告? - Elye
似乎这个bug已经修复了;我的应用程序过去需要这个hack,但是使用11.8.0的播放服务不再需要它 - yuval


答案:


我在将Firebase引入项目时遇到了这个问题。这是第一个被添加到项目中的后台服务,所以我决定用一项什么都不做的服务做一些调查。

这个建成:

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

但这导致构建失败:

public class HopefullyBuildsService extends FirebaseMessagingService {
}

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

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

无论出于何种原因,尝试直接注入Firebase派生服务会导致构建以您描述的方式失败。然而,间接注入另一个类然后实例化它,服务内部的老式方式允许它再次构建。

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

然后它建好了。不可否认,让这个中间人类很烦人,而firebase派生的服务必须以间接的方式与注入的组件进行交互。但是我不清楚为什么我不能注入Firebase衍生服务,或者Firebase的特殊之处让Dagger2感到不快。


11
2018-06-29 19:09



为您的解决方法+1,在我尝试将依赖项注入其中后,FirebaseMessagingService也是我的问题。混淆可能存在一些问题? - gnuf
我希望Fireben和Dagger家伙可以解释这个问题 - John Ernest Guadalupe
当您扩展“FirebaseInstanceIdService”时也会发生。 - LEO
令人难以置信的是它的原因。是否有关于谷歌广场的问题报告? - Elye
似乎这个bug已经修复了;我的应用程序过去需要这个hack,但是使用11.8.0的播放服务不再需要它 - yuval