2017-12-05 50 views
10

के साथ एक कोटलिन + जावा 9 प्रोजेक्ट का निर्माण करना मैं ग्रैडल (और जावा 9, ईमानदार होने के लिए) के लिए बिल्कुल नया हूं, और मैं जावा 9 का मिश्रण है जो एक साधारण लाइब्रेरी प्रोजेक्ट बनाने के लिए ग्रैडल का उपयोग करने की कोशिश कर रहा हूं और कोटलिन। अधिक विस्तार से, जावा में एक इंटरफ़ेस और कोटलिन में कार्यान्वयन है; मैं कोटलिन में सब कुछ करूँगा, लेकिन modules-info.java जावा है वैसे भी, इसलिए मैंने इस तरह से काम करने का फैसला किया।ग्रैटल

मैं 1.2.0 कोटलिन प्लगइन के साथ इंटेलिजे आइडिया पर निर्माण कर रहा हूं और 4.3.1 धीरे-धीरे परिभाषित किया गया है।

फ़ाइल स्कीमा है:

+ src 
    + main 
    + java 
     + some.package 
     - Roundabout.java [an interface] 
     - module-info.java 
    + kotlin 
     + some.package.impl 
     - RoundaboutImpl.kt [implementing the interface] 

module-info.java है:

module some.package { 
    requires kotlin.stdlib; 
    exports some.package; 
} 

और build.gradle है:

buildscript { 
    ext.kotlin_version = '1.2.0' 

    repositories { 
     mavenCentral() 
    } 
    dependencies { 
     classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 
    } 
} 

group 'some.package' 
version '1.0-PRE_ALPHA' 

apply plugin: 'java-library' 
apply plugin: 'kotlin' 

tasks.withType(JavaCompile) { 
    options.encoding = 'UTF-8' 
} 

sourceCompatibility = 9 

compileJava { 
    dependsOn(':compileKotlin') 
    doFirst { 
     options.compilerArgs = [ 
       '--module-path', classpath.asPath, 
     ] 
     classpath = files() 
    } 
} 

repositories { 
    mavenCentral() 
} 

dependencies { 
    compile group: 'org.jetbrains.kotlin', name: 'kotlin-stdlib', version: "$kotlin_version" 
    testCompile group: 'junit', name: 'junit', version: '4.12' 
} 

compileKotlin { 
    kotlinOptions.jvmTarget = "1.8" 
} 

compileTestKotlin { 
    kotlinOptions.jvmTarget = "1.8" 
} 

सूचना है कि मैं जावा संकलन कार्य पर एक मॉड्यूल पथ निर्दिष्ट करना पड़ा , या संकलन विफल रहता है:

error: module not found: kotlin.stdlib requires kotlin.stdlib;

वैसे भी, अब इस बिल्ड इस त्रुटि के साथ विफल रहता है, और मैं समझ नहीं है कि यह कैसे हल करने के लिए:

error: package some.package.impl does not exist

import some.package.impl.RoundaboutImpl;

error: cannot find symbol

return new RoundaboutImpl<>(queueSize, parallelism, worker, threadPool);

मैं लगता कि संकलन के Kotlin हिस्सा ठीक हो रहा है, तो जावा भाग विफल रहता है क्योंकि यह कोटलिन पक्ष को "नहीं" देखता है, इसलिए बोलने के लिए।

मुझे लगता है कि मुझे क्लासपाथ में पहले से संकलित कोटलिन कक्षाओं को लोड करने के लिए इसे किसी भी तरह से बताना चाहिए; लेकिन (पहले) मैं इसे धीरे-धीरे कैसे कर सकता हूं? और (दूसरा) क्या यह भी संभव है? मुझे लगता है कि आप जावा 9 में मॉड्यूल पथ और कक्षा पथ को मिश्रण नहीं कर सकते हैं।

मैं इसे कैसे हल कर सकता हूं? मुझे लगता है कि यह एक बहुत ही सामान्य स्थिति है, क्योंकि प्रत्येक जावा 9-शैली मॉड्यूल एक मिश्रित भाषा मॉड्यूल होगा (module-info.java की वजह से), इसलिए मुझे लगता है कि मुझे यहां कुछ मूलभूत याद आ रही है।

अग्रिम धन्यवाद!

+0

पैडेंटिक होने के लिए, 'मॉड्यूल-info.java' _really_ जावा नहीं है, यह एक विशेष डीएसएल है, लेकिन कोटलिन देवताओं ने कहा है कि [इसे पुनर्निर्मित करने में कोई मूल्य नहीं दिखता] (https://discuss.kotlinlang.org/ टी/कोटलिन-समर्थन-के-जावा-9-मॉड्यूल-सिस्टम/24 99) तो यह उतना ही रहेगा। – Moira

+0

हां, स्पष्टीकरण के लिए धन्यवाद! –

+2

क्या होगा यदि आप या तो जावा या कोटलिन दोनों में इंटरफ़ेस और इम्प्ल रखें। क्या यह संकलित करता है? इसके अलावा, आप जेवीएम 1.8 का उपयोग कर कोटलिन क्यों संकलित करेंगे? – nullpointer

उत्तर

5

हल हो गया! यह जावा के रूप में ही dir को kotlin संकलन dir स्थापित करने के लिए पर्याप्त था:

compileKotlin.destinationDir = compileJava.destinationDir 

यह अब काम करता है एक ही पेड़ में या अलग पेड़ों में स्रोतों के साथ दोनों; लेकिन एक quirk के साथ: jar कार्य डुप्लिकेट की सभी प्रविष्टियों के साथ एक जार पैदा करता है। मैं इसे ठीक करने पर काम करूंगा।

सभी के लिए धन्यवाद!

+1

पूर्ण, जार {duplicatesStrategy = "बहिष्कृत करें"} के साथ संपन्न –