2017-12-24 115 views
5

मेरे पास कोटलिन ग्रैडल प्लगइन का उपयोग करके एक ग्रैडल प्रोजेक्ट है। मैं एक जावा 9 मॉड्यूल का निर्माण करना चाहते तो मेरी निर्देशिका संरचना इस तरह दिखता है:क्या कोटलिन 1.2.10 और जावा 9 में स्वचालित मॉड्यूल के संबंध में विपरीत नियम हैं?

src/main/java/ 
    - module-info.java 
src/main/kotlin/ 
    - Foo.kt 
    - Bar.kt 
build.gradle 
... 

मेरे build.gradle वाणी निम्नलिखित निर्भरता:

dependencies { 
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.2.10" 
    compile "org.jetbrains.kotlin:kotlin-reflect:1.2.10" 
    compile "org.junit.jupiter:junit-jupiter-api:5.0.2" 
} 

और मैं अपने Kotlin स्रोत में इन निर्भरताओं के सभी का उपयोग करें (Foo.kt, Bar.kt, ...)।

सब कुछ hunky-dory काम करता है, तो मैं बहुत तरह मेरे module-info.java लिखें:

module my.module { 
    requires kotlin.stdlib; 
    exports my.module.pkg; 
} 

और अगर मैं this technique का उपयोग कर compileJava कार्य के दौरान javac करने के लिए सभी मेरी संकलन समय निर्भरता की आपूर्ति।

हालांकि अगर मैं compileJava कार्य (module-info.java संकलित करने के लिए), मैं निम्नलिखित चेतावनी दौरान जावा के लिए -Xlint:all पर बारी:

/path/to/my.module/src/main/java/module-info.java:26: warning: requires directive for an automatic module 
    requires kotlin.stdlib; 
       ^
तो यहाँ हम है जावा, javac कि शिकायत

kotlin.stdlib एक स्वचालित मॉड्यूल है इसलिए मेरे पास requires क्लॉज नहीं होना चाहिए।

लेकिन अगर मैं javac खुश है, यह बनाता है kotlincjavac से भी गुस्सा था बनाने के लिए requires खंड हटाना (मैं एक त्रुटि एक चेतावनी नहीं मिल):

e: /path/to/my.module/src/main/java/module-info.java: The Kotlin standard library is not found in the module graph. Please ensure you have the 'requires kotlin.stdlib' clause in your module definition 

FAILURE: Build failed with an exception. 

* What went wrong: 
Execution failed for task ':my.module:compileKotlin'. 

अब मुझे लगता है कि, भी ठीक कर सकते हैं, के द्वारा संपादन मेरी compileKotlin कार्य इस प्रकार:

compileKotlin { 
    doFirst { 
     kotlinOptions.freeCompilerArgs = ['-Xallow-kotlin-package'] 
    } 
} 

लेकिन यह अधिक त्रुटियों के लिए केवल सुराग compileKotlin कार्य के दौरान, सभी यह एक तरह लग रही:

e: /path/to/my.module/src/main/kotlin/Foo.kt: (27, 30): Symbol is declared in module 'org.junit.jupiter.api' which current module does not depend on 

और फिर अगर मैं freeCompilerArgs को "-Xmodule-path=${classpath.asPath}" जोड़ने और classpath की स्थापना रिक्त द्वारा एक classpath के बजाय एक मॉड्यूल पथ लेने के लिए compileKotlin मजबूर करने के लिए प्रयास करते हैं, Kotlin संकलक नहीं कुछ भी पा सकते हैं, और मैं अंत अनसुलझा संदर्भ त्रुटियों के zillions के साथ!

कोटलिन कंपाइलर मुझे क्यों बता रहा है कि जावा संकलक विपरीत कहता है कि मुझे requires kotlin.stdlib; होना चाहिए? जावा 9 मॉड्यूल बनाने के लिए मैं एक साथ काम करने के लिए कोटलिन और जावा कैसे प्राप्त कर सकता हूं?

+0

क्या आपने 'org.junit.jupiter.api' के लिए 'आवश्यकता' निर्देश जोड़ने का प्रयास किया था? हो सकता है कि यह कोटलिन कंपाइलर – msrd0

+0

@ msrd0 से पिछली त्रुटि का कारण बनता है, मैंने अभी कोशिश की है (अलगाव में पहले ऐसा नहीं किया था)। 'Org.junit.jupiter.api' को' मॉड्यूल-info.java' में 'आवश्यक' * के रूप में जोड़ना * अनसुलझा प्रतीक संदर्भ त्रुटियों से छुटकारा पाता है। फिर भी, यह 'javac' से' 'एक्सलिंट: सभी 'चेतावनी उत्पन्न करता है जो स्वचालित मॉड्यूल पर' आवश्यकता 'नहीं चाहता है। तो फिर ऐसा लगता है जैसे कोटलिन और जावा यहां विभिन्न नियम लागू कर रहे हैं। – 0xbe5077ed

+0

क्या आपने इसे '-Xallow-kotlin-package' ध्वज के साथ एक साथ करने की कोशिश की? – msrd0

उत्तर

0

आप Kotlin में जावा 9 मॉड्यूल संलेखन रहे हैं, तो आप मानक पुस्तकालय एपीआई पर स्पष्ट निर्भरता के अलावा संकलित Kotlin कोड के क्रम निर्भरता के अनुसार आपके module-info.java में requires kotlin.stdlib घोषित करने के लिए है।

javac आपको लिंट सक्षम होने पर स्वचालित मॉड्यूल की आवश्यकता के बारे में चेतावनी देता है, क्योंकि स्वचालित मॉड्यूल में सामान्य मॉड्यूल की तुलना में कुछ संभावित drawbacks होते हैं। जब तक मानक पुस्तकालय को सामान्य मॉड्यूल के रूप में संकलित नहीं किया जाता है, तब तक आपको इस चेतावनी से निपटना होगा।

-Xallow-kotlin-package संकलक झंडा आप, require kotlin.stdlib छोड़ देते हैं क्योंकि यह जब मानक पुस्तकालय में ही संकलित किया गया है केवल इस्तेमाल किया जा करने का इरादा है की अनुमति देता है। जाहिर है, यदि आप इस ध्वज को निर्दिष्ट करते हैं और उस आवश्यकता को छोड़ देते हैं, तो आप मानक लाइब्रेरी से किसी भी एपीआई का उपयोग नहीं कर पाएंगे, इसलिए यह वास्तव में आपके लिए एक विकल्प नहीं है।

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