আমার অফিসে, জেরেস শব্দটির নিছক উল্লেখ বিকাশকারীদের কাছ থেকে হত্যাকারী ক্রোধ উদ্দীপনার জন্য যথেষ্ট। এসও-তে অন্যান্য জেরেসের প্রশ্নগুলিতে এক ঝলক নজরে ইঙ্গিত পাওয়া যায় যে প্রায় সমস্ত ম্যাভেন ব্যবহারকারীই কোনও না কোনও সময়ে এই সমস্যায় "স্পর্শ" হয়েছিলেন। দুর্ভাগ্যক্রমে, সমস্যাটি বোঝার জন্য জেরেসের ইতিহাস সম্পর্কে কিছুটা জ্ঞান প্রয়োজন ...
ইতিহাস
জাভা ইকোসিস্টেমের সর্বাধিক ব্যবহৃত XML পার্সার X জাভাতে লেখা প্রায় প্রতিটি লাইব্রেরি বা কাঠামো কিছু ক্ষমতার মধ্যে জেরেস ব্যবহার করে (ট্রানজিটিভালি, সরাসরি না হলে)।
অফিসিয়াল বাইনারিগুলিতে অন্তর্ভুক্ত জেরেসের জারগুলি আজও সংস্করণযুক্ত নয়। উদাহরণস্বরূপ, Xerces 2.11.0 বাস্তবায়ন জারের নাম দেওয়া হয়েছে
xercesImpl.jar
এবং নেইxercesImpl-2.11.0.jar
।জেরেসেস টিম মাভেন ব্যবহার করে না , যার অর্থ তারা মাভেন সেন্ট্রালে কোনও অফিসিয়াল রিলিজ আপলোড করে না ।
জেরেসেসকে সিঙ্গেল জার (
xerces.jar
) হিসাবে প্রকাশ করা হত, তবে দুটি জারে বিভক্ত করা হয়েছিল, একটিতে এপিআই (xml-apis.jar
) রয়েছে এবং একটিতে সেগুলি (এপিআইxercesImpl.jar
) ( ) প্রয়োগকরণ রয়েছে । অনেক পুরানো মাভেন পিওএম এখনও তার উপর নির্ভরতা ঘোষণা করেxerces.jar
। অতীতে এক পর্যায়ে, জেরেসগুলি প্রকাশিত হয়েছিলxmlParserAPIs.jar
, যা কিছু পুরানো পিওএমও নির্ভর করে।XML-apis এবং xercesImpl jars এর জন্য নির্ধারিত সংস্করণগুলি যারা তাদের জারগুলি মাভেন সংগ্রহস্থলে স্থাপন করে থাকে তাদের দ্বারা প্রায়শই পৃথক। উদাহরণস্বরূপ, xML-apis সংস্করণ 1.3.03 দেওয়া যেতে পারে এবং xercesImpl সংস্করণ 2.8.0 দেওয়া হতে পারে, যদিও উভয়ই Xerces 2.8.0 থেকে। কারণ লোকেরা প্রায়শই এক্সএমএল-এপিস জারটিকে যে স্পেসিফিকেশনগুলি প্রয়োগ করে তার সংস্করণ দিয়ে ট্যাগ করে। এই একটি খুব সুন্দর, কিন্তু অসম্পূর্ণ ভাঙ্গন হয় এখানে ।
বিষয়গুলিকে জটিল করার জন্য, জেরেএস হ'ল জেআরই-তে অন্তর্ভুক্ত এক্সএমএল প্রসেসিং (জ্যাকএক্সপি) এর জাভা এপিআইয়ের রেফারেন্স প্রয়োগে ব্যবহৃত এক্সএমএল পার্সার। বাস্তবায়ন ক্লাসগুলি
com.sun.*
নেমস্পেসের অধীনে পুনরায় বিতরণ করা হয় , যা তাদের সরাসরি প্রবেশ করা বিপজ্জনক করে তোলে, কারণ তারা কিছু জেআরইতে নাও পারা যায়। যাইহোক, সমস্ত জেরেসের কার্যকারিতাটি APIjava.*
এবংjavax.*
API এর মাধ্যমে প্রকাশিত হয় না ; উদাহরণস্বরূপ, এমন কোনও এপিআই নেই যা জেরেসের সিরিয়ালাইজেশন প্রকাশ করে।বিভ্রান্তিকর মেসে যুক্ত করে, প্রায় সমস্ত সার্লেট পাত্রে (জেবস, জেটি, গ্লাসফিশ, টমক্যাট ইত্যাদি) তাদের এক বা একাধিক
/lib
ফোল্ডারে জেরেসের সাথে জাহাজ পাঠায় ।
সমস্যা
সংঘাতের সমাধান
কিছু - বা সম্ভবত সমস্ত - উপরের কারণগুলির জন্য, অনেকগুলি সংস্থা তাদের পিওএমগুলিতে কাস্টম বিল্ড জেরেসগুলি প্রকাশ করে এবং গ্রাস করে। আপনার যদি একটি ছোট অ্যাপ্লিকেশন থাকে এবং কেবলমাত্র মাভেন সেন্ট্রাল ব্যবহার করে থাকেন তবে এটি সত্যিই কোনও সমস্যা নয় তবে এটি এন্টারপ্রাইজ সফ্টওয়্যারটির জন্য খুব শীঘ্রই একটি ইস্যুতে পরিণত হয় যেখানে আর্টিফ্যাক্টরি বা নেক্সাস একাধিক সংগ্রহস্থল (জেবস, হাইবারনেট, ইত্যাদি) প্রক্সিং করছে:
উদাহরণস্বরূপ, সংস্থা এ এরূপ প্রকাশ করতে পারে xml-apis
:
<groupId>org.apache.xerces</groupId>
<artifactId>xml-apis</artifactId>
<version>2.9.1</version>
এদিকে, সংস্থা বি এর jar
মতো প্রকাশ করতে পারে :
<groupId>xml-apis</groupId>
<artifactId>xml-apis</artifactId>
<version>1.3.04</version>
যদিও বি এর jar
এ এর চেয়ে কম সংস্করণ jar
, তবে মাভেন জানেন না যে তারা একই শিল্পকর্মের কারণ তারা বিভিন্ন
groupId
। সুতরাং, এটি দ্বন্দ্বের সমাধান করতে পারে না এবং উভয়ই
jar
সমাধান হওয়া নির্ভরতা হিসাবে অন্তর্ভুক্ত হবে:
ক্লাসলোডার হেল
উপরে উল্লিখিত হিসাবে, জেআরসি জাহাজগুলি জ্যাকসপি আরআইয়ের জেরেসের সাথে। যদিও সমস্ত জেরেস মাভেন নির্ভরতা <exclusion>
গুলি হিসাবে হিসাবে চিহ্নিত করা ভাল হবে<provided>
, আপনার উপর নির্ভরশীল তৃতীয় পক্ষের কোডটি আপনি যে JDK ব্যবহার করছেন তার JAXP- এ সরবরাহ করা সংস্করণটির সাথে কাজ করতে পারে বা নাও করতে পারে। তদ্ব্যতীত, আপনি বিবাদ জানাতে আপনার সার্লেট পাত্রে জার্সিস জারগুলি প্রেরণ করেছেন। এটি আপনাকে বেশ কয়েকটি পছন্দ সহ ছেড়ে দেয়: আপনি কি সার্লেট সংস্করণটি মুছবেন এবং আপনার ধারকটি JAXP সংস্করণে চলেছে আশা করি? সার্লেলেট সংস্করণটি ছেড়ে দেওয়া কি ভাল এবং আশা করা যায় যে আপনার অ্যাপ্লিকেশন ফ্রেমওয়ার্কগুলি সার্লেট সংস্করণে চলে? উপরে বর্ণিত সমাধান না করা দ্বন্দ্বগুলির মধ্যে যদি দু'একটি আপনার প্রোডাক্টে স্খলিত হয় (বৃহত সংস্থায় ঘটতে সহজ হয়), আপনি ক্লাসলোডার নরকে খুব দ্রুত নিজেকে আবিষ্কার করেন, ক্লাস লোডার রানটাইমের সময় ক্লাস লোডার কোন সংস্করণটি বেছে নিচ্ছে এবং তা ভেবে অবাক হচ্ছেন উইন্ডোজ এবং লিনাক্সে একই পাত্রটি বেছে নেবে (সম্ভবত না)।
সলিউশন?
আমরা যত সব Xerces ম্যাভেন নির্ভরতা উপলক্ষে চেষ্টা করেছি <provided>
অথবা একটি যেমন <exclusion>
, কিন্তু এই দেওয়া জোরদার করা (বিশেষ করে বৃহৎ দলের সঙ্গে) আছে এমন দুরূহ নিদর্শন অনেক alias লেখা (আছে xml-apis
, xerces
, xercesImpl
, xmlParserAPIs
, ইত্যাদি)। অতিরিক্তভাবে, আমাদের তৃতীয় পক্ষের libs / ফ্রেমওয়ার্কগুলি JAXP সংস্করণ বা কোনও সার্লেট ধারক দ্বারা সরবরাহিত সংস্করণে চলতে পারে না।
আমরা মাভেনের সাথে এই সমস্যাটি কীভাবে সেরা সমাধান করতে পারি? আমাদের কি আমাদের নির্ভরতাগুলির উপর এমন সূক্ষ্ম নিয়ন্ত্রণ ব্যবহার করতে হবে এবং তারপরে ক্লায়িক লোডের উপর নির্ভর করা উচিত? বিশ্বব্যাপী সমস্ত জেরেসের নির্ভরতা বাদ দেওয়ার কোনও উপায় আছে এবং আমাদের সমস্ত ফ্রেমওয়ার্ক / লিবসকে জ্যাকএক্সপি সংস্করণ ব্যবহার করতে বাধ্য করবে?
আপডেট : জোশুয়া স্পিয়াক XERCESJ-1454 এ জেরেস বিল্ড স্ক্রিপ্টগুলির একটি প্যাচযুক্ত সংস্করণ আপলোড করেছে যা মাভেন সেন্ট্রালে আপলোড করার অনুমতি দেয়। এই ইস্যুতে ভোট দিন / দেখুন / অবদান রাখুন এবং আসুন একবার এবং সবার জন্য এই সমস্যাটি সমাধান করুন।