नज़दीकी क्षितिज पर जावा 9 के साथ मैंने सोचा कि यह मेरी कुछ परियोजनाओं को जावा 9 पर बंद करने के लिए एक अच्छा सीखने का अभ्यास होगा। मेरी परियोजनाओं में से एक में rxjava और rxjavafx के लिए निर्भरताएं हैंजावा में स्वचालित मॉड्यूल के साथ पैकेज विवाद 9
dependencies {
compile 'io.reactivex:rxjava:1.2.6'
compile 'io.reactivex:rxjavafx:1.0.0'
...
}
मैं इस प्रोजेक्ट को नाम-मॉड्यूल के रूप में बनाना चाहता हूं। ऐसा करने के लिए मैं एक module-info.java
फ़ाइल बनाने की आवश्यकता है और मैं rxjava
और rxjavafx
यहाँ के लिए आवश्यकताओं को निर्दिष्ट करने की आवश्यकता। हालांकि, इन libs के पास अभी तक कोई मॉड्यूल जानकारी नहीं है।
आदेश में इस के आसपास काम करने के लिए मुझे लगता है कि I need to create Automatic Modules पढ़ा है। से क्या मैं समझता हूँ, मैं एक साधारण नाम की rxjava
और rxjavafx
जार का नाम बदलने और फिर --module-path
पैरामीटर में जार की सूची की जरूरत है। मैं फिर अपने module-info.java
में जार नामों के साथ requires
निर्देश जोड़ता हूं।
module com.foo.bar {
requires rxjavafx;
requires rxjava;
}
मैं मेरे लिए जार नामों को संपादित करने के लिए एक Gradle काम लिखा था, और यह ज्यादातर मामलों में काम कर रहा है। यह उन सभी जारों को लेता है जिन्हें संकलित करने की आवश्यकता होती है और उन्हें संस्करण-जानकारी या स्लैश शामिल करने के लिए नामित नहीं किया जाता है।
tasks.withType(JavaCompile) {
delete { delete '/tmp/gradle' }
copy {
from configurations.compile + configurations.testCompile
into '/tmp/gradle'
rename '(.*)-[0-9]+\\..*.jar', '$1.jar'
rename { String fileName -> fileName.replace("-", "") }
}
options.compilerArgs += ['--module-path', fileTree(dir: '/tmp/gradle', include: '*.jar').getFiles().join(':')]
}
स्वाभाविक रूप से rx
पुस्तकालयों का हिस्सा उनके पैकेज के नाम से कुछ ... इस तथापि वापस जैसे त्रुटियों थूकने संकलक का कारण बनता है:
error: module reads package rx.subscriptions from both rxjava and rxjavafx
error: module reads package rx.schedulers from both rxjava and rxjavafx
error: module reads package rx.observables from both rxjava and rxjavafx
error: module rxjava reads package rx.subscriptions from both rxjavafx and rxjava
error: module rxjava reads package rx.schedulers from both rxjavafx and rxjava
error: module rxjava reads package rx.observables from both rxjavafx and rxjava
error: module rxjavafx reads package rx.subscriptions from both rxjava and rxjavafx
error: module rxjavafx reads package rx.schedulers from both rxjava and rxjavafx
error: module rxjavafx reads package rx.observables from both rxjava and rxjavafx
फ़ाइलों तो एक :
अलग स्ट्रिंग में concatenated रहे हैं यह इस समस्या के समाधान प्राप्त करने के लिए फिर से पैकेज के लिए rxjava
और rxjavafx
की सामग्री को एक भी जार में और है कि जोड़ने के लिए एक एकल मॉड्यूल के रूप में होगा एक ही रास्ता की तरह लगता है। यह एक अच्छा समाधान है, हालांकि की तरह प्रतीत नहीं होता ...
तो मेरी प्रश्न हैं:
- Am मैं सही ढंग से नया मॉड्यूल प्रणाली का उपयोग कर?
- इस त्रुटि के बारे में मैं क्या कर सकता हूं? और
- इन निर्भरताओं मुझे अद्यतन करने से रोका जा सके, या मैं सिर्फ अपने libs अद्यतन करने के लिए rx के लिए इंतजार करना चाहिए है?
नोट: मैं मानक java
/javac
के साथ इस चल की कोशिश की है और वे एक ही समस्याओं का कारण। यहां इसके अलावा मेरे जावा संस्करण है:
java version "9-ea"
Java(TM) SE Runtime Environment (build 9-ea+140)
Java HotSpot(TM) 64-Bit Server VM (build 9-ea+140, mixed mode)
छोटे सुधार (संभवतः): जब जार नाम से मॉड्यूल का नाम निकालने, मॉड्यूल प्रणाली बाहर सबस्ट्रिंग कि ~> संस्करणों की तरह लग रहे उन्हें नाम बदलने के बिना यह कोशिश फेंक देते हैं। मॉड्यूल पथ निर्देशिकाओं को भी स्वीकार करता है ~> यदि आपके पास एक डीआईआर है जिसमें केवल निर्भरताएं हैं, तो इसे सीधे मॉड्यूल पथ पर रखें। – Nicolai
आपके वर्तमान प्रश्न से संबंधित नहीं है, मैं सुझाव देता हूं कि जेडीके 9 के नए निर्माण के लिए अपग्रेड करना 9। बिल्ड करें (मुझे लगता है) निजी प्रकारों और प्रतिबिंबों के माध्यम से सदस्यों की पहुंच में कुछ महत्वपूर्ण बदलाव किए हैं। वर्तमान निर्माण 157 है। –