2016-10-06 18 views
20

पृष्ठभूमिजावा 9 मॉड्यूल सिस्टम वैकल्पिक निर्भरताओं का समर्थन करता है?

Maven में, एक विरूपण साक्ष्य

<optional>true</optional> 

जिसका अर्थ है कि निर्भरता की आवश्यकता नहीं है के साथ एक निर्भरता घोषणा कर सकते हैं, लेकिन वर्तमान अगर इस्तेमाल किया जा सकता।

The State of the Module System यह निर्दिष्ट करता है कि एक मॉड्यूल केवल आवश्यक मॉड्यूल पढ़ सकता है।

प्रश्न

  • जावा 9 मॉड्यूल प्रणाली वास्तव में वैकल्पिक निर्भरता का समर्थन नहीं करता है?
  • क्यों नहीं?
  • जावा 9 मॉड्यूल सिस्टम प्रदान करने वाले वैकल्पिक निर्भरताओं के वैकल्पिक विकल्प क्या हैं?

प्रयोग करें प्रकरण

मैं एक रूपरेखा है कि विभिन्न पुस्तकालयों कि या एक एप्लिकेशन द्वारा उपयोग नहीं किया जा सकता है एकीकृत करता है। वर्तमान में, यह ढांचा एक एकल जेएआर है जो अनुपस्थित पुस्तकालयों के लिए एकीकरण कोड छोड़ने के लिए कक्षापथ पर प्रतिबिंबित करता है।

मुझे लगता है कि हम इसे प्रत्येक कॉन्फ़िगरेशन के लिए एक अलग मॉड्यूल में विभाजित कर सकते हैं, लेकिन इससे JAR की संख्या में एक संयोजन विस्फोट हो सकता है, क्योंकि हमें केवल प्रत्येक वैकल्पिक निर्भरता के लिए अलग जेएआर की आवश्यकता नहीं होती है, बल्कि एक अलग वैकल्पिक निर्भरताओं के अधिकांश जोड़े के लिए जार ...

उत्तर

16

हां, optional dependencies are supportedthe original proposal से हवाला देते हुए:

static संशोधक निम्नलिखित अर्थ के साथ, एक requires निर्देश पर इस्तेमाल किया जा करने के लिए अनुमति देने के लिए मॉड्यूल घोषणाओं के भाषा बढ़ाएँ:

  • संकलन समय, requires static M एक अनिवार्य निर्भरता व्यक्त करता है । यह एक त्रुटि है यदि उपयुक्त मॉड्यूल को देखने योग्य मॉड्यूल के बीच नहीं पाया जा सकता है और हल किया जा सकता है।

  • संकलन समय के बाद चरणों में, requires static M एक वैकल्पिक निर्भरता व्यक्त करता है। मॉड्यूल सिस्टम रिज़ॉल्यूशन के दौरान उपयुक्त मॉड्यूल के लिए अवलोकन योग्य मॉड्यूल नहीं खोजेगा, लेकिन यदि परिणामस्वरूप मॉड्यूल ग्राफ़ में उपयुक्त मॉड्यूल होता है तो यह सामान्य पोस्ट-रिज़ॉल्यूशन सैनिटी चेक करने से पहले उपयुक्त पठनीयता एज जोड़ देगा। [...]

इस प्रकार प्रपत्र

module joda.beans { 
    requires static joda.collect; 
    ... 
} 

यह सुनिश्चित करेगी कि joda.collect मॉड्यूल संकलन समय पर उपलब्ध है, का एक काल्पनिक मॉड्यूल घोषणा तो joda.beans मॉड्यूल joda.collect को संदर्भित करता है में उस कोड किसी भी झगड़े के बिना संकलित किया जा सकता है। हालांकि, यह गारंटी नहीं देगी कि joda.collect लिंक समय या रन टाइम पर उपलब्ध है।

(बीच में, official documentation was created for that feature।)

मैं इसके लिए a demo लिखा था। रोचक जानकारियों मॉड्यूल वैकल्पिक निर्भरता घोषित करने के module-info.java रहे हैं ...

module org.codefx.demo.advent { 
    // list the required modules 
    requires org.codefx.demo.advent.calendar; 
    // with 'static' the factories are only required at compile time; 
    // to be present at run time either other modules most require them 
    // or they must be added with the '--add-modules' command line option 
    requires static org.codefx.demo.advent.factory.chocolate; 
    requires static org.codefx.demo.advent.factory.quote; 
} 

... और एक ही मॉड्यूल इसकी वैकल्पिक निर्भरता से प्रकार की पहुंच चाहता है कि भीतर कोड। यह करने के लिए लिखा है ताकि यह कृपा विफल रहता है प्रकार ChocolateFactory और/या QuoteFactory अनुपस्थित रहे हैं:

$java \ 
    --add-modules org.codefx.demo.advent.factory.chocolate,org.codefx.demo.advent.factory.quote \ 
    -p mods -m org.codefx.demo.advent 
:

private static List<SurpriseFactory> createSurpriseFactories() { 
    return Stream.of(
      createChocolateFactoryIfAccessible(), 
      createQuoteFactoryIfAccessible()) 
      .flatMap(Optional::stream) 
      .collect(toList()); 
} 

private static Optional<SurpriseFactory> createChocolateFactoryIfAccessible() { 
    try { 
     return Optional.of(new ChocolateFactory()); 
    } catch (NoClassDefFoundError er) { 
     return Optional.empty(); 
    } 
} 

private static Optional<SurpriseFactory> createQuoteFactoryIfAccessible() { 
    try { 
     return Optional.of(new QuoteFactory()); 
    } catch (NoClassDefFoundError er) { 
     return Optional.empty(); 
    } 
} 

अंत में, आदेश पंक्ति कौन-से मॉड्यूल अनुप्रयोग के साथ शुरूआत परिभाषित करने के लिए इस्तेमाल किया जा सकता

यह भी संभव है कि अन्य मॉड्यूल उन्हें गैर-वैकल्पिक रूप से आवश्यक हों, जो जेवीएम को मॉड्यूल ग्राफ में शामिल करने के लिए मजबूर करता है।

+1

भविष्य के संदर्भ के लिए: क्या आप जानते हैं कि वैकल्पिक निर्भरता प्रस्ताव वास्तव में अंतिम रिलीज में किया गया है या नहीं? – Lii

+2

अभी तक कोई अंतिम रिलीज नहीं है (जावा 9 जुलाई 2017 के लिए निर्धारित है) लेकिन यह अभी भी ईए बिल्डों का हिस्सा है और यह मौका है कि यह शून्य पर सीमाएं निकाल लेता है। – Nicolai

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