2016-02-25 9 views
11

मैं डैगर 2 का परीक्षण कर रहा हूं, और सबकुछ काम कर रहा था, जब तक कि मैंने कुछ रिफैक्टरिंग नहीं किया। अब धीरे-धीरे IllegalArgumentException फेंक रहा है, और मैं यह नहीं समझ सकता कि मैंने जो बदलाव किया है वह अब त्रुटि उत्पन्न कर रहा है। मैं Gradle फ़ाइल में कोई परिवर्तन नहीं किया है, और यह स्टैक ट्रेस का खामियाजा हो रहा है:डैगर 2 बिल्ड अवैध अर्ग्यूमेंट एक्सेप्शन संकलन डेबगजवाविथजाक

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 

कोई फाइल डैगर द्वारा और साथ उत्पन्न किया जा रहा है, और वे पहले से थे। मैं इसे ठीक करने के लिए हर विधि का प्रयास कर रहा हूं जिसे मैं पा सकता हूं, जिसमें ज्यादातर ग्रिड फाइलों को ठीक करना या बिल्ड फ़ोल्डर को साफ़ करना शामिल है, लेकिन अभी तक कुछ भी काम नहीं किया है।


त्वरित अपडेट (चूंकि मैंने कुछ अप-वोट देखा); मैंने कभी नहीं पता कि मैंने क्या गलत किया है, मैं एक पुराने निर्माण में वापस आ गया। वापसी के बाद, मैंने दोबारा रिफैक्टरिंग की और यह ठीक काम किया। जब मैंने प्रारंभ में कोड को दोबारा प्रतिक्रिया दी, तो मैंने कुछ अलग किया होगा, लेकिन मुझे नहीं पता कि यह क्या था।

अगर किसी को यह पता चल गया कि इसका क्या कारण हो सकता है, तो मुझे यकीन है कि इससे भविष्य में किसी और की मदद मिलेगी, या भविष्य में, इस मुद्दे में भाग लेंगे।

उत्तर

11

प्रोजेक्ट में फायरबेस को लाने के दौरान मैं इस मुद्दे में भाग गया। यह परियोजना में पहली पृष्ठभूमि सेवा शामिल की गई थी इसलिए मैंने कुछ ऐसी सेवा के साथ कुछ करने का फैसला किया जो कुछ भी नहीं करता था।

यह बनाया:

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

और फिर यह ठीक बनाया गया। माना जाता है कि, इस बिचौलियों के वर्ग को परेशान करना और अग्निशामक व्युत्पन्न सेवा को अप्रत्यक्ष फैशन में इंजेक्शन घटकों के साथ बातचीत करना है। लेकिन यह मुझे स्पष्ट नहीं है कि मैं फायरबेस व्युत्पन्न सेवा में इंजेक्ट क्यों नहीं कर सकता, या फायरबेस के बारे में विशेष क्या है जिसने डैगर 2 को दुखी किया।

+1

+1 आपके वर्कअराउंड के लिए, यह वास्तव में मेरे मुद्दे पर FirebaseMessagingService के साथ भी था जब मैंने इसमें निर्भरता लगाने की कोशिश की। शायद obfuscation के साथ कुछ मुद्दा है? – gnuf

+0

फायरबेस और डैगर लड़कों द्वारा यह मेरी इच्छा कैसे समझा जा सकता है –

+0

जब आप "FirebaseInstanceIdService" का विस्तार करते हैं तो भी होता है। – LEO

संबंधित मुद्दे