জাভা / মাভেনে "জেরেস নরক" দিয়ে কাজ করছেন?


731

আমার অফিসে, জেরেস শব্দটির নিছক উল্লেখ বিকাশকারীদের কাছ থেকে হত্যাকারী ক্রোধ উদ্দীপনার জন্য যথেষ্ট। এসও-তে অন্যান্য জেরেসের প্রশ্নগুলিতে এক ঝলক নজরে ইঙ্গিত পাওয়া যায় যে প্রায় সমস্ত ম্যাভেন ব্যবহারকারীই কোনও না কোনও সময়ে এই সমস্যায় "স্পর্শ" হয়েছিলেন। দুর্ভাগ্যক্রমে, সমস্যাটি বোঝার জন্য জেরেসের ইতিহাস সম্পর্কে কিছুটা জ্ঞান প্রয়োজন ...

ইতিহাস

  • জাভা ইকোসিস্টেমের সর্বাধিক ব্যবহৃত 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.*নেমস্পেসের অধীনে পুনরায় বিতরণ করা হয় , যা তাদের সরাসরি প্রবেশ করা বিপজ্জনক করে তোলে, কারণ তারা কিছু জেআরইতে নাও পারা যায়। যাইহোক, সমস্ত জেরেসের কার্যকারিতাটি API java.*এবং javax.*API এর মাধ্যমে প্রকাশিত হয় না ; উদাহরণস্বরূপ, এমন কোনও এপিআই নেই যা জেরেসের সিরিয়ালাইজেশন প্রকাশ করে।

  • বিভ্রান্তিকর মেসে যুক্ত করে, প্রায় সমস্ত সার্লেট পাত্রে (জেবস, জেটি, গ্লাসফিশ, টমক্যাট ইত্যাদি) তাদের এক বা একাধিক /libফোল্ডারে জেরেসের সাথে জাহাজ পাঠায় ।

সমস্যা

সংঘাতের সমাধান

কিছু - বা সম্ভবত সমস্ত - উপরের কারণগুলির জন্য, অনেকগুলি সংস্থা তাদের পিওএমগুলিতে কাস্টম বিল্ড জেরেসগুলি প্রকাশ করে এবং গ্রাস করে। আপনার যদি একটি ছোট অ্যাপ্লিকেশন থাকে এবং কেবলমাত্র মাভেন সেন্ট্রাল ব্যবহার করে থাকেন তবে এটি সত্যিই কোনও সমস্যা নয় তবে এটি এন্টারপ্রাইজ সফ্টওয়্যারটির জন্য খুব শীঘ্রই একটি ইস্যুতে পরিণত হয় যেখানে আর্টিফ্যাক্টরি বা নেক্সাস একাধিক সংগ্রহস্থল (জেবস, হাইবারনেট, ইত্যাদি) প্রক্সিং করছে:

xML-apis আর্টিক্ট্রির দ্বারা প্রক্সড

উদাহরণস্বরূপ, সংস্থা এ এরূপ প্রকাশ করতে পারে 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 এ জেরেস বিল্ড স্ক্রিপ্টগুলির একটি প্যাচযুক্ত সংস্করণ আপলোড করেছে যা মাভেন সেন্ট্রালে আপলোড করার অনুমতি দেয়। এই ইস্যুতে ভোট দিন / দেখুন / অবদান রাখুন এবং আসুন একবার এবং সবার জন্য এই সমস্যাটি সমাধান করুন।


8
এই বিস্তারিত প্রশ্নের জন্য ধন্যবাদ। আমি জেরেসের দলের অনুপ্রেরণা বুঝতে পারি না। আমি তাদের কল্পনা করতে পারি যে তারা সেখানে পণ্য নিয়ে গর্বিত হয়েছে এবং এটি ব্যবহার করে অন্যদের সাথে আনন্দিত হবে তবে জেরেসেস এবং ম্যাভেনের বর্তমান অবস্থা অবজ্ঞাপূর্ণ। তবুও, তারা যা চায় তা করতে পারে এমনকি তা যদি আমার কাছে কোনও বুদ্ধি না করে। আমি অবাক হই যে সোনটাইপ বলছিদের যদি কোনও পরামর্শ থাকে।
ট্র্যাভিস শ্নিবার্গার

35
এটি সম্ভবত বিষয়বহুল, তবে এটি সম্ভবত আমার আগে দেখা আরও ভাল পোস্ট। এই প্রশ্নের সাথে আরও সম্পর্কিত, আপনি যা বর্ণনা করেন তা আমাদের মধ্যে অন্যতম সবচেয়ে বেদনাদায়ক সমস্যা। দুর্দান্ত উদ্যোগ!
জিন-রেমি রেভি

2
@ ট্রাভিসশনিবার্গার অনেক জটিলতার কারণ সান নিজেই জেআরইতে জেরেস ব্যবহার করতে পছন্দ করেছেন। আপনি এটির জন্য খুব কমই জেরেসের লোকদের দোষ দিতে পারেন।
থরবজর্ন রাভন অ্যান্ডারসন

সাধারণত আমরা জেরেসের এমন একটি সংস্করণ সন্ধান করার চেষ্টা করি যা পরীক্ষার এবং ত্রুটির দ্বারা সমস্ত নির্ভরশীল গ্রন্থাগারগুলিকে সন্তুষ্ট করে, যদি এটি সম্ভব না হয় তবে অ্যাপ্লিকেশনটিকে পৃথক ওয়ারে (পৃথক শ্রেণীর লোডার) বিভক্ত করার জন্য ওয়ার্সের রিফ্যাক্টর। এই সরঞ্জামটি (আমি এটি লিখেছি) জারগুলি এবং ক্লাসগুলির ক্লাসপাথটি জিজ্ঞাসা করার অনুমতি দিয়ে jhades.org যা চলছে তা বুঝতে সহায়তা করে - সার্ভারটি এখনও শুরু না হওয়া অবস্থায় এটি কাজ করে
কৌণিক বিশ্ববিদ্যালয়

উইন্ডোতে গিট ব্যাশ থেকে সার্ভিস মিক্স শুরু করার সময় আপনি যদি এই ত্রুটিটি পেয়ে থাকেন তবে কেবলমাত্র একটি দ্রুত মন্তব্য: পরিবর্তে এটি "সাধারণ" সেন্টিমিডি থেকে শুরু করুন।
অ্যালবার্ট হেন্ডরিক্স

উত্তর:


111

২০ শে ফেব্রুয়ারী ২০১৩ সাল থেকে মাভেন সেন্ট্রিয়ায় জেরেসের ২.১১.০ জার্স (এবং উত্স জারস!) রয়েছে! ম্যাভেন সেন্ট্রাল এর জেরেস দেখুন । আমি অবাক হলাম কেন তারা https://issues.apache.org/jira/browse/XERCESJ-1454 সমাধান করেনি ...

আমি ব্যবহার করেছি:

<dependency>
    <groupId>xerces</groupId>
    <artifactId>xercesImpl</artifactId>
    <version>2.11.0</version>
</dependency>

এবং সমস্ত নির্ভরতা সূক্ষ্ম সমাধান করেছে - এমনকি সঠিক xml-apis-1.4.01!

এবং কী সবচেয়ে গুরুত্বপূর্ণ (এবং যা অতীতে সুস্পষ্ট ছিল না) - ম্যাভেন সেন্ট্রালের জেআর সরকারী Xerces-J-bin.2.11.0.zipবন্টনের মতোই জেআর

আমি তবে xml-schema-1.1-betaসংস্করণটি খুঁজে পাইনি - classifierঅতিরিক্ত নির্ভরতার কারণে এটি কোনও মাভেন- সংস্করণ হতে পারে না ।


9
যদিও এটি খুব বিভ্রান্তিকর যা xml-apis:xml-apis:1.4.01তার চেয়েও নতুনxml-apis:xml-apis:2.0.2 ?? দেখতে search.maven.org/...
হেন্ডি উত্থাপন Irawan

এটি বিভ্রান্তিকর, তবে এটি তৃতীয় পক্ষের নন-সংস্করণযুক্ত জেরেস জারগুলির আপলোডগুলির কারণে, যেমন জাস্টিংআরিক তার পোস্টে বলছিল। xML-apis 2.9.1 1.3.04 এর সমান, সুতরাং সেই অর্থে, 1.4.01 1.3.04 এর চেয়ে নতুন (এবং সংখ্যাগতভাবে বৃহত্তর)।
liltitus27

1
আপনার pom.xML এ যদি আপনার দুটি xercesImpl এবং xML-apis থাকে তবে xML-apis নির্ভরতা মুছে ফেলার বিষয়ে নিশ্চিত হন! অন্যথায় 2.0.2 এর কুরুচিপূর্ণ মাথাটি পুনর্বার করে।
মাইকজেআরমসি 56

64

স্পষ্টতই, আমাদের মুখোমুখি হওয়া বেশিরভাগ কিছুই ঠিক ডাব্লু / জ্যাকএক্সপি সংস্করণে কাজ করে, তাই আমরা সর্বদা বাদ দিয়ে থাকি xml-apis এবং করি xercesImpl


13
আপনি কি এর জন্য একটি pom.xML স্নিপেট যুক্ত করতে পারেন?
chzbrgla

10
যখন আমি এটি চেষ্টা করি, আমি java.lang.NoClassDefFoundError: org/w3c/dom/ElementTraversalরানটাইমে জাভামেলডি এবং স্প্রিং নিক্ষেপ করি ।
ডেভিড মোলস

ডেভিড মোলসের প্রতিক্রিয়ায় যুক্ত করতে - আমি দেখেছি যে অর্ধ ডজন ট্রানজিটিভ নির্ভরতাগুলির এলিমেন্টট্রেভারসাল প্রয়োজন। সবচেয়ে সাধারণভাবে বসন্ত এবং হাদুপে বিভিন্ন জিনিস।
স্কট কেরি

2
যদি আপনি java.lang.NoClassDefFoundError পান: org / w3c / dom / ElementTraversal আপনার পোমে xML-apis 1.4.01 যোগ করার চেষ্টা করুন (এবং অন্যান্য সমস্ত নির্ভরশীল সংস্করণ বাদ দিন)
জাস্টিন রোয়ে

1
এলিমেট্রএভারসাল একটি নতুন ক্লাস যা জেরেসেস 11 এ যুক্ত হয়েছে এবং এক্সএমএল-এপিআইএস: এক্সএমএল-এপিআইএস: 1.4.01 নির্ভরতাতে উপলব্ধ। সুতরাং আপনাকে নিজের প্রকল্পে ম্যানুয়ালি ক্লাসটি অনুলিপি করতে বা সম্পূর্ণ নির্ভরতা ব্যবহারের প্রয়োজন হতে পারে যা ক্লাস লোডারে নকল ক্লাস তৈরি করে। তবে জেডিকে 9 এ এই ক্লাসটি অন্তর্ভুক্ত করা হয়েছিল যাতে বৈশিষ্ট্যটিতে আপনাকে ডিপ অপসারণ করতে হবে।
সের্গেই পোনোমারেভ

42

নিষিদ্ধ নির্ভরতা নিয়মের সাহায্যে আপনি ম্যাভেন এনফোর্সর প্লাগইনটি ব্যবহার করতে পারেন। এটি আপনাকে পছন্দ না করে এমন সমস্ত উপমা নিষিদ্ধ করার অনুমতি দেয় এবং কেবলমাত্র আপনি চান না তাকে অনুমতি দেয়। লঙ্ঘন করা হলে এই নিয়মগুলি আপনার প্রকল্পের মাভেন বিল্ডটিকে ব্যর্থ করবে। তদ্ব্যতীত, যদি এই নিয়মটি কোনও উদ্যোগে সমস্ত প্রকল্পের জন্য প্রযোজ্য হয় তবে আপনি প্লাগইন কনফিগারেশনটিকে কর্পোরেট প্যারেন্ট পমতে রাখতে পারেন।

দেখা:


33

আমি জানি এই প্রশ্নের সঠিক উত্তর দেয় না, তবে পিপিএল Google থেকে আসে যা তাদের নির্ভরতা পরিচালনার জন্য গ্রেডল ব্যবহার করে:

আমি গ্রেডলের সাথে এই জাতীয় সমস্ত জেরেস / জাভা 8 ইস্যু থেকে মুক্তি পেতে সক্ষম হয়েছি:

configurations {
    all*.exclude group: 'xml-apis'
    all*.exclude group: 'xerces'
}

36
সুন্দর, মাভেনের সাথে এটি করতে আপনার প্রায় 4000 লাইনের এক্সএমএল দরকার।
টেকনোপল

যে সমস্যার সমাধান করেনি। অ্যান্ড্রয়েড-গ্রেডল লোকের জন্য অন্য কোনও ইঙ্গিত?
nyxee

2
@ টেকনোপল এক্সএমএল সম্পূর্ণরূপে কনফিগারেশনের জন্য ব্যবহৃত হয়। গ্রোভি একটি উচ্চ স্তরের প্রোগ্রামিং ভাষা। কখনও কখনও আপনি XML এর ম্যাজিক জন্য গ্রোভির পরিবর্তে এর এক্সপ্লিট সাক্ষীর জন্য ব্যবহার করতে চাইতে পারেন।
8:38

16

আমি অনুমান করি যে এখানে আপনার একটি প্রশ্নের উত্তর দেওয়া দরকার:

আপনার অ্যাপ্লিকেশনের সমস্ত কিছুর সাথে বেঁচে থাকতে পারে এমন কোনও কাতরতা * .জার রয়েছে কি?

যদি না হয় তবে আপনি মূলত স্ক্রুযুক্ত এবং ওএসজিআই এর মতো কিছু ব্যবহার করতে হবে যা আপনাকে একই সাথে একটি লাইব্রেরির বিভিন্ন সংস্করণ লোড করতে দেয়। সতর্কতা অবলম্বন করুন যে এটি মূলত শ্রেণিবোদ্ধার সমস্যাগুলির সাথে জার সংস্করণ সমস্যাগুলি প্রতিস্থাপন করে ...

যদি এমন সংস্করণ উপস্থিত থাকে তবে আপনি আপনার সংগ্রহস্থলটিকে সমস্ত ধরণের নির্ভরতার জন্য সেই সংস্করণটি ফিরিয়ে আনতে পারবেন। এটি একটি কুরুচিপূর্ণ হ্যাক এবং একাধিকবার আপনার ক্লাসপথে একই xerces প্রয়োগের সাথে শেষ হবে তবে একাধিকবারের বিভিন্ন সংস্করণ থাকার চেয়ে ভাল than

আপনি প্রতিটি জেরেসের উপর নির্ভরশীলতা বাদ দিতে এবং আপনি যে সংস্করণটি ব্যবহার করতে চান তাতে একটি যুক্ত করতে পারেন।

আমি অবাক হই যদি আপনি মাভেনের প্লাগইন হিসাবে কোনও ধরণের সংস্করণ সমাধানের কৌশলটি লিখতে পারেন। এটি সম্ভবত সর্বোত্তম সমাধান হতে পারে তবে যদি কিছুটা সম্ভব হয় তবে কিছু গবেষণা এবং কোডিং প্রয়োজন।

আপনার রানটাইম পরিবেশে থাকা সংস্করণটির জন্য, আপনাকে অবশ্যই নিশ্চিত করতে হবে যে এটি হয় অ্যাপ্লিকেশন শ্রেণিপথ থেকে সরিয়ে গেছে বা সার্ভারের লিব ফোল্ডারটি বিবেচনা করার আগে ক্লাস লোডিংয়ের জন্য অ্যাপ্লিকেশন জারগুলি প্রথমে বিবেচিত হবে।

সুতরাং এটি মোড়ানোর জন্য: এটি একটি জগাখিচুড়ি এবং এটি পরিবর্তন হবে না।


1
বিভিন্ন ক্লাসলয়েডারদের দ্বারা লোড করা একই জার থেকে একই শ্রেণি এখনও একটি ক্লাসকাট এক্সেকশন (সমস্ত স্ট্যান্ডার্ড পাত্রে)
আজাক্স

3
যথাযথভাবে। সে কারণেই আমি লিখেছি: সতর্কতা অবলম্বন করুন যে এটি মূলত ক্লাস লোডার ইস্যুগুলির সাথে জার সংস্করণ ইস্যুগুলি প্রতিস্থাপন করে
জেনস স্কাউডার

7

সেখানে অন্য কোনো বিকল্প যে এখানে অন্বেষণ করা হয় নি হল: প্রকাশক Xerces যেমন ম্যাভেন মধ্যে নির্ভরতা ঐচ্ছিক :

<dependency>
   <groupId>xerces</groupId>
   <artifactId>xercesImpl</artifactId>
   <version>...</version>
   <optional>true</optional>
</dependency>

মূলত এটি যা করে তা হ'ল সমস্ত নির্ভরশীলদের তাদের জেরেসের সংস্করণ ঘোষণা করতে বাধ্য করা বা তাদের প্রকল্পটি সংকলন করবে না। যদি তারা এই নির্ভরতা ওভাররাইড করতে চান তবে তারা এটি করতে স্বাগত জানায় তবে তারা সম্ভাব্য সমস্যার মালিক হবে।

এটি ডাউন স্ট্রিম প্রকল্পগুলির জন্য একটি শক্তিশালী প্রণোদনা তৈরি করে:

  • একটি সক্রিয় সিদ্ধান্ত নিন। তারা কি জেরেসের একই সংস্করণ নিয়ে যায় বা অন্য কিছু ব্যবহার করে?
  • প্রকৃতপক্ষে তাদের পার্সিং পরীক্ষা করুন (উদাহরণস্বরূপ ইউনিট পরীক্ষার মাধ্যমে) এবং শ্রেণি লোডিং পাশাপাশি ক্লাসপাথটি বিশৃঙ্খলা না করে।

সমস্ত বিকাশকারী সদ্য প্রবর্তিত নির্ভরতা (যেমন সহ mvn dependency:tree) ট্র্যাক রাখেন না । এই পদ্ধতির সাথে সাথে বিষয়টি তাদের নজরে আনবে।

এটি আমাদের প্রতিষ্ঠানে বেশ ভাল কাজ করে। এর প্রবর্তনের আগে আমরা ওপি একই নরকে বাস করতাম।


সংস্করণ উপাদানটির মধ্যে আমার কি আক্ষরিক বিন্দু-বিন্দু-বিন্দু ব্যবহার করা উচিত, বা আমার কি ২.6.২ এর মতো একটি বাস্তব সংস্করণ ব্যবহার করা উচিত?
খ্রিস্টমটাউন

3
@ ক্রিসিনমটাউন আসল সংস্করণ।
ড্যানিয়েল

6

প্রতিটি মাভেন প্রকল্পের জেরেসের উপর নির্ভর করে থেমে যাওয়া উচিত, সম্ভবত তারা সত্যিই তা করে না। এক্সএমএল এপিআই এবং একটি ইমপি 1.4 সাল থেকে জাভার অংশ। জেরেস বা এক্সএমএল এপিআইয়ের উপর নির্ভর করার দরকার নেই, এটি জাভা বা সুইংয়ের উপর নির্ভর করে বলে saying এটি অন্তর্নিহিত।

আমি যদি কোনও ম্যাভেন রেপোয়ের মালিক হয়ে থাকি তবে আমি ক্রমাগতভাবে জেরেসের নির্ভরতা অপসারণ করতে একটি স্ক্রিপ্ট লিখতাম এবং আমাকে পড়তে যে এই রেপোটির জাভা 1.4 প্রয়োজন।

আসলে যা কিছু ভেঙে যায় কারণ এটি org.apache আমদানির মাধ্যমে জেরেসকে সরাসরি উল্লেখ করে এটি জাভা 1.4 স্তরে (এবং ২০০২ সাল থেকে সম্পন্ন করেছে) বা জেভিএম স্তরে সলিউশন নয়, মভেন নয়, এটিকে জাভির ১.৪ স্তরে আনার জন্য একটি কোড ফিক্সের প্রয়োজন।


আপনি যে রিফ্যাক্টরটি বিশদটি দিয়েছিলেন সেগুলি সম্পাদন করার সময় আপনার জাভা ফাইল এবং কনফিগারেশনের পাঠ্যে প্যাকেজ এবং শ্রেণীর নামগুলিও সন্ধান করতে হবে। আপনি দেখতে পাবেন যে বিকাশকারীরা ক্লাস.ফোর্নাম এবং অনুরূপ কনস্ট্রাক্টস দ্বারা ব্যবহৃত হওয়া ধ্রুব স্ট্রিংগুলিতে ইমপ্ল ক্লাসগুলির FQN রেখেছেন।
ডেরেক বেনেট

এটি ধরে নিয়েছে যে সমস্ত SAX বাস্তবায়ন একই কাজ করে, যা সত্য নয়। xercesImpl লাইব্রেরি জাভা.এক্সএমএল.পার্সার লাইব্রেরির অভাবের কনফিগারেশন বিকল্পগুলির জন্য অনুমতি দেয়।
অমলগোভিনাস

6

আপনার এক্সএমএল নরকের স্তরটি সনাক্ত করতে সহায়তা করার জন্য আপনাকে প্রথমে ডিবাগ করা উচিত। আমার মতে, প্রথম পদক্ষেপটি যুক্ত করা

-Djavax.xml.parsers.SAXParserFactory=com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl
-Djavax.xml.transform.TransformerFactory=com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl
-Djavax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl

কমান্ড লাইনে। যদি এটি কাজ করে তবে লাইব্রেরিগুলি বাদ দিয়ে শুরু করুন। যদি না হয় তবে অ্যাড করুন

-Djaxp.debug=1

কমান্ড লাইনে।


2

বাদ দেওয়া ব্যতীত যা সাহায্য করবে তা হ'ল মডুলার নির্ভরতা।

একটি সমতল শ্রেণিবদ্ধকরণ (স্ট্যান্ডেলোন অ্যাপ্লিকেশন), বা আধা-শ্রেণিবদ্ধ (JBoss AS / EAP 5.x) সহ এটি একটি সমস্যা ছিল।

তবে ওএসজিআই এবং জেবস মডিউলগুলির মতো মডিউল ফ্রেমওয়ার্কগুলি সহ , এটি আর এত বেশি ব্যথা হয় না। লাইব্রেরিগুলি যেকোন লাইব্রেরিটি স্বাধীনভাবে ব্যবহার করতে পারে।

অবশ্যই, এটি কেবলমাত্র একটি একক বাস্তবায়ন এবং সংস্করণ দিয়ে সজ্জিত হওয়া সবচেয়ে সুপারিশযোগ্য, তবে যদি অন্য কোনও উপায় না থাকে (আরও বেশি লিবিসের অতিরিক্ত বৈশিষ্ট্য ব্যবহার করা হয়) তবে মডিউলাইজিং আপনাকে বাঁচাতে পারে।

কার্যক্রমে জেবস মডিউলগুলির একটি ভাল উদাহরণ হ'ল, প্রাকৃতিকভাবে, জবস এএস 7 / ইএপি 6 / ওয়াইল্ডফ্লাই 8 , যার জন্য এটি প্রাথমিকভাবে বিকাশ করা হয়েছিল।

উদাহরণ মডিউল সংজ্ঞা:

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.1" name="org.jboss.msc">
    <main-class name="org.jboss.msc.Version"/>
    <properties>
        <property name="my.property" value="foo"/>
    </properties>
    <resources>
        <resource-root path="jboss-msc-1.0.1.GA.jar"/>
    </resources>
    <dependencies>
        <module name="javax.api"/>
        <module name="org.jboss.logging"/>
        <module name="org.jboss.modules"/>
        <!-- Optional deps -->
        <module name="javax.inject.api" optional="true"/>
        <module name="org.jboss.threads" optional="true"/>
    </dependencies>
</module>

ওএসজিআইয়ের সাথে তুলনা করে, জেবস মডিউলগুলি সহজ এবং দ্রুত। কিছু বৈশিষ্ট্য অনুপস্থিত থাকাকালীন, এটি বেশিরভাগ প্রকল্পের জন্য যথেষ্ট (যা বেশিরভাগ) একজন বিক্রেতার নিয়ন্ত্রণে থাকে এবং অত্যাশ্চর্য দ্রুত বুটের অনুমতি দেয় (প্যারালাইলেজড নির্ভরতা সমাধানের কারণে)।

নোট করুন যে জাভা 8-র জন্য একটি মডুলারাইজেশন প্রচেষ্টা চলছে , কিন্তু আফাইক যা মূলত জেআরই নিজেই মডিউলাইজ করার জন্য, এটি অ্যাপসের ক্ষেত্রে প্রযোজ্য কিনা তা নিশ্চিত নয়।


jboss মডিউলগুলি স্থির মডুলারাইজেশন সম্পর্কে। রানটাইম মডুলারাইজেশন ওএসজিআইয়ের সাথে এটির সামান্য কিছু নেই - আমি বলব তারা একে অপরের প্রশংসা করে। যদিও এটি একটি দুর্দান্ত সিস্টেম।
eis

* প্রশংসার পরিবর্তে পরিপূরক
রবার্ট মাইকস

2

স্পষ্টতই xerces:xml-apis:1.4.01এখন আর মভেন সেন্ট্রালে নেই, তবে যা xerces:xercesImpl:2.11.0উল্লেখ রয়েছে।

এটি আমার পক্ষে কাজ করে:

<dependency>
  <groupId>xerces</groupId>
  <artifactId>xercesImpl</artifactId>
  <version>2.11.0</version>
  <exclusions>
    <exclusion>
      <groupId>xerces</groupId>
      <artifactId>xml-apis</artifactId>
    </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>xml-apis</groupId>
  <artifactId>xml-apis</artifactId>
  <version>1.4.01</version>
</dependency>

1

আমার বন্ধু যে খুব সহজ, এখানে একটি উদাহরণ:

<dependency>
    <groupId>xalan</groupId>
    <artifactId>xalan</artifactId>
    <version>2.7.2</version>
    <scope>${my-scope}</scope>
    <exclusions>
        <exclusion>
        <groupId>xml-apis</groupId>
        <artifactId>xml-apis</artifactId>
    </exclusion>
</dependency>

এবং আপনি যদি টার্মিনালটিতে পরীক্ষা করতে চান (এই উদাহরণের জন্য উইন্ডোজ কনসোল) যে আপনার খাঁটি গাছটির কোনও সমস্যা নেই:

mvn dependency:tree -Dverbose | grep --color=always '(.* conflict\|^' | less -r
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.