तर्क के लिए, आइए दावा करते हैं कि जावा 8 (और पहले) में पहले से ही मॉड्यूल (जार) और मॉड्यूल सिस्टम (क्लासपाथ) का "फॉर्म" है। लेकिन इन के साथ अच्छी तरह से ज्ञात समस्याएं हैं।
समस्याओं की जांच करके, हम आरा के लिए प्रेरणा का वर्णन कर सकते हैं। (निम्नलिखित अनुमान हम OSGi, JBoss मॉड्यूल, आदि का उपयोग नहीं कर रहे हैं, जो निश्चित रूप से समाधान प्रदान करते हैं।)
समस्या 1: सार्वजनिक भी सार्वजनिक है
निम्नलिखित वर्गों पर विचार करें (मान लें कि दोनों सार्वजनिक हैं):
com.acme.foo.db.api.UserDao
com.acme.foo.db.impl.UserDaoImpl
Foo.com पर, हम यह तय कर सकते हैं कि हमारी टीम को उपयोग करना चाहिए UserDao
और उपयोग नहीं करना चाहिएUserDaoImpl
सीधे । हालाँकि, क्लासपाथ पर इसे लागू करने का कोई तरीका नहीं है।
आरा में, एक मॉड्यूल में एक module-info.java
फ़ाइल होती है जो हमें स्पष्ट रूप से यह बताने की अनुमति देती है कि अन्य मॉड्यूल के लिए सार्वजनिक क्या है। अर्थात्, जनता के पास बारीकियों है। उदाहरण के लिए:
module com.acme.foo.db {
exports com.acme.foo.db.api;
}
समस्या 2: प्रतिबिंब बेलगाम है
# 1 में कक्षाओं को देखते हुए, कोई भी अभी भी जावा 8 में ऐसा कर सकता है:
Class c = Class.forName("com.acme.foo.db.impl.UserDaoImpl");
Object obj = c.getConstructor().newInstance();
यह कहना है: प्रतिबिंब शक्तिशाली और आवश्यक है, लेकिन अगर अनियंत्रित है, तो इसका उपयोग अवांछनीय तरीकों से एक मॉड्यूल के आंतरिक में पहुंचने के लिए किया जा सकता है। मार्क रेनहोल्ड का एक बल्कि भयावह उदाहरण है । (एसओ पद यहां है ।)
आरा में, मजबूत एनकैप्सुलेशन प्रतिबिंब सहित एक वर्ग तक पहुंच से इनकार करने की क्षमता प्रदान करता है। (यह कमांड लाइन सेटिंग्स पर निर्भर हो सकता है, JDK 9 के लिए संशोधित टेक कल्पना लंबित है।) ध्यान दें कि आरा का उपयोग JDK के लिए ही किया जाता है, ओरेकल का दावा है कि इससे जावा टीम प्लेटफ़ॉर्म इंटर्ल्स को और अधिक तेज़ी से नवाचार करने की अनुमति देगा।
समस्या 3: क्लासपाथ वास्तु संबंधों को मिटा देता है
एक टीम में आम तौर पर जार के बीच संबंधों के बारे में एक मानसिक मॉडल होता है। उदाहरण के लिए, foo-app.jar
उपयोग हो सकता है foo-services.jar
जो उपयोग करता है foo-db.jar
। हम foo-app.jar
"सर्विस लेयर" को बायपास नहीं करना चाहिए और foo-db.jar
सीधे उपयोग करना चाहिए । हालांकि, क्लासपैथ के माध्यम से इसे लागू करने का कोई तरीका नहीं है। मार्क रीनहोल्ड ने यहां इसका उल्लेख किया है ।
तुलना करके, आरा मॉड्यूल के लिए एक स्पष्ट, विश्वसनीय पहुंच मॉडल प्रदान करता है।
समस्या 4: अखंड रन-टाइम
जावा रनटाइम अखंड में है rt.jar
। मेरी मशीन पर, 20k वर्गों के साथ यह 60+ एमबी है! सूक्ष्म सेवाओं, IoT उपकरणों, आदि के युग में, यदि उनका उपयोग नहीं किया जा रहा है, तो डिस्क पर कोरबा, स्विंग, एक्सएमएल और अन्य पुस्तकालयों का होना अवांछनीय है।
आरा कई मॉड्यूल में जेडीके को ही तोड़ता है ; उदाहरण के लिए java.sql में परिचित SQL कक्षाएं हैं। इसके कई लाभ हैं, लेकिन एक नया jlink
उपकरण है। एक ऐप को पूरी तरह से संशोधित माना जाता है, jlink
एक वितरण योग्य रन-टाइम छवि उत्पन्न करता है जिसे केवल निर्दिष्ट मॉड्यूल (और उनकी निर्भरता) को शामिल करने के लिए छंटनी की जाती है। आगे की ओर देखते हुए, ओरेकल भविष्य को आगे बढ़ाता है जहां जेडडीके मॉड्यूल को मूल कोड में आगे-आगे संकलित किया जाता है। हालांकि jlink
वैकल्पिक है, और एओटी संकलन प्रयोगात्मक है, वे प्रमुख संकेत हैं जहां ओरेकल का नेतृत्व किया जाता है।
समस्या 5: संस्करण
यह सर्वविदित है कि क्लासपैथ हमें एक ही जार के कई संस्करणों का उपयोग करने की अनुमति नहीं देता है: जैसे bar-lib-1.1.jar
और bar-lib-2.2.jar
।
आरा इस समस्या को संबोधित नहीं करता है; मार्क रीनहोल्ड ने यहां तर्क दिया है । सार यह है कि मावेन, ग्रैडल और अन्य उपकरण निर्भरता प्रबंधन के लिए एक बड़े पारिस्थितिकी तंत्र का प्रतिनिधित्व करते हैं, और एक अन्य समाधान लाभकारी से अधिक हानिकारक होगा।
यह ध्यान दिया जाना चाहिए कि अन्य समाधान (जैसे OSGi) वास्तव में इस समस्या को संबोधित करते हैं (और अन्य, # 4 से अलग)।
जमीनी स्तर
आरा के लिए कुछ प्रमुख बिंदु, विशिष्ट समस्याओं से प्रेरित हैं।
ध्यान दें कि आरा, OSGi, JBoss मॉड्यूल, आदि के बीच विवाद की व्याख्या एक अलग चर्चा है जो किसी अन्य स्टैन एक्सचेंज साइट पर है। यहाँ वर्णित की तुलना में समाधानों के बीच कई और अंतर हैं। क्या अधिक है, JSR 376 के लिए सार्वजनिक समीक्षा पुनर्विचार मतदान को अनुमोदित करने के लिए पर्याप्त सहमति थी ।