2017-02-21 27 views
21

नज़दीकी क्षितिज पर जावा 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) 
+2

छोटे सुधार (संभवतः): जब जार नाम से मॉड्यूल का नाम निकालने, मॉड्यूल प्रणाली बाहर सबस्ट्रिंग कि ~> संस्करणों की तरह लग रहे उन्हें नाम बदलने के बिना यह कोशिश फेंक देते हैं। मॉड्यूल पथ निर्देशिकाओं को भी स्वीकार करता है ~> यदि आपके पास एक डीआईआर है जिसमें केवल निर्भरताएं हैं, तो इसे सीधे मॉड्यूल पथ पर रखें। – Nicolai

+2

आपके वर्तमान प्रश्न से संबंधित नहीं है, मैं सुझाव देता हूं कि जेडीके 9 के नए निर्माण के लिए अपग्रेड करना 9। बिल्ड करें (मुझे लगता है) निजी प्रकारों और प्रतिबिंबों के माध्यम से सदस्यों की पहुंच में कुछ महत्वपूर्ण बदलाव किए हैं। वर्तमान निर्माण 157 है। –

उत्तर

14

Am I using the new module system correctly?

हां। जो आप देख रहे हैं वह इरादा व्यवहार है, और ऐसा इसलिए है क्योंकि जेपीएमएस मॉड्यूल स्प्लिट पैकेजों की अनुमति नहीं देता है।

मामले में आप शब्द "विभाजन पैकेज" से परिचित नहीं हैं यह मूलतः एक ही पैकेज दो अलग मॉड्यूल से आने वाले के दो सदस्यों का मतलब है।
com.foo.A (moduleA.jar से)
com.foo.B (moduleB से:

उदाहरण के लिए

  1. (कठिन) "unsplit" पैकेज निर्भरता: जार)

    What can I do about this error?

    आपके पास दो विकल्प। हालांकि यह मुश्किल या असंभव हो सकता है यदि आप लाइब्रेरी

  2. (आसान) के आंतरिक कार्यकलापों से परिचित नहीं हैं, तो ऊपर वर्णित अनुसार दो जार एक सिंगल जार (और इसलिए एक एकल स्वचालित मॉड्यूल) में गठबंधन करें। मैं मानता हूं कि यह एक "अच्छा" समाधान नहीं है, लेकिन पहले स्थान पर विभाजित पैकेज होने के कारण आम तौर पर एक अच्छा विचार नहीं है।

Do these dependencies prevent me from updating, or should I just wait for rx to update their libs?

उम्मीद है कि rx अंत में अद्यतन करेगा उनके libs भविष्य में कुछ बिंदु पर संकुल विभाजित किया है नहीं करने के लिए। तब तक, मेरी सिफारिश सिर्फ दो जारों को एक सिंगल जार (विकल्प # 2) में तोड़ना होगा।

+1

हम्म यह सुनने के लिए थोड़ा निराशाजनक है। मुझे लगता है कि विभाजन-पैकेज के संयोजन के लिए एक ग्रेडल कार्य लिखना बहुत मुश्किल नहीं होगा। हालांकि इसके बारे में चालाक होना होगा। अपने निर्माण के समय फिर से पैकेजिंग किसी और के libs ¯ नष्ट करने के लिए नहीं करना चाहते \\ _ (ツ) _/¯ – flakes

+4

हां, यह एक दर्द है, लेकिन afaik वहाँ विभाजन संकुल अनुमति न देने के लिए सुरक्षा + प्रदर्शन लाभ हैं। उम्मीद है कि संयुक्त मालिक संयुक्त जार प्रदान करने के बारे में जल्दी होंगे। या मैं ऑटो-संयुक्त जार प्रदान करने वाले मेवेन केंद्रीय देख सकता था। –

+1

जावा 9 माइग्रेशन नोट्स पढ़ने के लिए मजाकिया है कि jdk9 आपके कोड को बहुत ही कम कर देगा। लेकिन यह प्रतिबंध पुस्तकालयों के टन को तोड़ देता है। स्प्लिट पैकेज पुस्तकालयों के लिए एक बहुत ही सामान्य प्रथा है जो कई जारों के माध्यम से वितरित की जाती है। – eugcomax

3

मैं simmiliar समस्या थी: और द्वारा छोड़कर:

error: module flyway.core reads package javax.transaction.xa from both jboss.transaction.api.1.2.spec and java.sql 
error: module slf4j.api reads package javax.transaction.xa from both jboss.transaction.api.1.2.spec and java.sql 
error: module hibernate.core reads package javax.transaction.xa from both jboss.transaction.api.1.2.spec and java.sql 
.../src/main/java/module-info.java:1: error: module eu.com.x reads package javax.transaction.xa from both java.sql and jboss.transaction.api.1.2.spec 

मैं अपने प्रोजेक्ट ("पेड़ mvn निर्भरता" सहायक हो सकता है "Gradle निर्भरता" या) की जाँच सकर्मक निर्भरता द्वारा विभाजित संकुल संकलन समस्या से छुटकारा पाने सकता है कोड simmiliar रहे हैं:

configurations.all { 
    exclude group: 'org.jboss.spec.javax.transaction', module: 'jboss-transaction-api_1.2_spec' 
} 

या

<dependencies> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
     <version>5.2.10.Final</version> 
     <exclusions> 
     <exclusion> 
      <groupId>org.jboss.spec.javax.transaction</groupId> 
      <artifactId>jboss-transaction-api_1.2_spec</artifactId> 
     </exclusion> 
     </exclusions> 
    </dependency> 
    </dependencies> 

नहीं जार प्रतिनिधि मेरी समस्या की आवश्यकता है Ickaging। यह समस्या # जेडीके 8 पर नहीं हुई है। संभवतः निर्भरताओं को छोड़कर हर परियोजना में मदद नहीं करता है।

+0

मेरे पास यह वही समस्या है, लेकिन इस मामले में 'बॉस-लेनदेन-एपीआई_1.2_एसपीसीसी निर्भरता को छोड़कर काम करने में असफल रहा। इसमें 'java.transaction.xa' पैकेज में अतिरिक्त कक्षाएं हैं जो 'java.sql' मॉड्यूल द्वारा निर्यात किए गए उसी पैकेज में नहीं हैं। नतीजतन मैं इसके बजाय 'java.lang.ClassNotFoundException' रनटाइम अपवाद प्राप्त करता हूं। जब तक यह हल नहीं हो जाता है तब तक मुझे अपने प्रोजेक्ट को 'अनौपचारिक' करना पड़ सकता है। – Paul

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