2016-02-25 20 views
11

Tôi đã thử nghiệm Dagger 2, và mọi thứ đã hoạt động, cho đến khi tôi thực hiện một chút tái cấu trúc. Bây giờ gradle là ném một IllegalArgumentException, và tôi không thể tìm ra những gì tôi đã thay đổi mà bây giờ gây ra lỗi. Tôi chưa thực hiện bất kỳ thay đổi nào đối với tệp gradle và điều này có vẻ là gánh nặng của dấu vết ngăn xếp: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 

Không có tệp nào được tạo bởi Dagger và trước đó. Tôi đã thử mọi phương pháp để khắc phục điều này mà tôi có thể tìm thấy, chủ yếu liên quan đến việc sửa chữa các tập tin gradle hoặc thanh toán bù trừ ra các thư mục xây dựng, nhưng cho đến nay không có gì đã làm việc.


Cập nhật nhanh (vì tôi nhận thấy một vài phiếu bầu); Tôi chưa bao giờ tìm ra những gì tôi đã làm sai, tôi đã trở lại một công trình cũ. Sau khi hoàn nguyên, tôi đã tái cấu trúc lại và nó hoạt động tốt. Tôi phải làm điều gì đó khác khi tôi ban đầu tái cấu trúc mã, nhưng tôi không biết nó là gì.

Nếu bất cứ ai có ý tưởng về những gì có thể gây ra điều này, tôi chắc chắn nó sẽ giúp đỡ bất kỳ ai khác, hoặc trong tương lai, sẽ gặp phải vấn đề này.

Trả lời

11

Tôi đã gặp sự cố này khi đưa Firebase vào dự án. Đây là dịch vụ nền đầu tiên được thêm vào dự án nên tôi quyết định làm một số dịch vụ với một dịch vụ không làm gì cả.

này được xây dựng:

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

Nhưng điều này gây ra việc xây dựng thất bại:

public class HopefullyBuildsService extends FirebaseMessagingService { 
} 

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

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

Đối với bất cứ lý do cố gắng để tiêm trực tiếp vào một dịch vụ căn cứ hỏa lực có nguồn gốc gây ra việc xây dựng thất bại theo cách bạn mô tả. Tuy nhiên gián tiếp tiêm vào một lớp khác và sau đó instantiating nó theo cách cũ trong dịch vụ cho phép nó để xây dựng một lần nữa.

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

Và sau đó nó được xây dựng tốt. Phải thừa nhận rằng, có lớp trung gian này là gây phiền nhiễu và dịch vụ bắt nguồn từ firebase phải tương tác với các thành phần được tiêm theo cách gián tiếp. Nhưng nó không rõ ràng với tôi tại sao tôi không thể tiêm vào một dịch vụ có nguồn gốc Firebase, Hoặc những gì là đặc biệt về Firebase khiến Dagger2 không hài lòng.

+1

+1 cho giải pháp thay thế của bạn, đó cũng chính là vấn đề của tôi với FirebaseMessagingService sau khi tôi cố gắng đưa các phụ thuộc vào nó. Có thể có một số vấn đề với obfuscation? – gnuf

+0

Làm thế nào tôi muốn điều này có thể đã được giải thích bởi các nhân viên Firebase và Dagger –

+0

Xảy ra khi bạn mở rộng "FirebaseInstanceIdService". – LEO

Các vấn đề liên quan