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