একটি "ছায়াময়" জাভা নির্ভরতা কী?


74

এখানে জেভিএম বিকাশকারী। ইদানীং আমি আইআরসি চ্যাট রুমগুলিতে এমনকি নিজস্ব অফিসে তথাকথিত " ছায়াময়ী " জাভা গ্রন্থাগারগুলি সম্পর্কে ব্যানার দেখেছি । ব্যবহারের প্রসঙ্গে কিছু হবে:

" " Xyz জন্য ক্লায়েন্ট। ছায়াময় অমুক তাই একটি উপলব্ধ করা হয় " "

নিখুঁত উদাহরণ এইচবিসের জন্য এই জিরা ইস্যু : " ছায়াময় নির্ভরতা সহ একটি ক্লায়েন্ট শৈল্পিক প্রকাশ করুন "

সুতরাং আমি জিজ্ঞাসা করছি: একটি ছায়া গোটা JAR কী, এটি "ছায়াময়" হওয়ার অর্থ কী?

উত্তর:


86

শেডিং নির্ভরতা হ'ল নির্ভরতাগুলি অন্তর্ভুক্ত করে এবং পুনর্নামকরণের প্রক্রিয়া (এইভাবে ক্লাসগুলি স্থানান্তরিত করা এবং প্রভাবিত বাইকোড এবং সংস্থানগুলি পুনরায় লেখার জন্য) আপনার নিজের কোডের পাশাপাশি আপনি বান্ডিল করেন এমন একটি ব্যক্তিগত অনুলিপি তৈরি করতে

ধারণাটি সাধারণত উবার-জার্স (ওরফে ফ্যাট জারস ) এর সাথে সম্পর্কিত।

শব্দটি সম্পর্কে কিছু বিভ্রান্তি রয়েছে , কারণ ম্যাভেন শেড প্লাগইন, যা এই একক নামে 2 টি জিনিস করে (তাদের নিজস্ব পৃষ্ঠাটি উদ্ধৃত করে):

এই প্লাগইনটি নির্ভরশীলতাগুলিকে একটি উবার-জারে প্যাকেজ করার ক্ষমতা সরবরাহ করে যার সাথে এর নির্ভরতা এবং ছায়া - নামকরণ - কিছু নির্ভরতার কিছু প্যাকেজ রয়েছে।

সুতরাং শেড অংশ আসলে ঐচ্ছিক: প্লাগইন আপনার বয়াম (চর্বি বয়াম) এ নির্ভরতা অন্তর্ভুক্ত করার অনুমতি দেয়, এবং ঐচ্ছিকরূপে নামান্তর (আলোছায়া) নির্ভরতা

অন্য উত্স যুক্ত করা হচ্ছে :

লাইব্রেরির ছায়া গোপন করার জন্য বলা লাইব্রেরির বিষয়বস্তু ফাইলগুলি নিয়ে যাওয়া, সেগুলি আপনার নিজের জারে রাখুন এবং তাদের প্যাকেজ পরিবর্তন করুন । এটি প্যাকেজিং থেকে আলাদা যা আপনার নিজের জারে লাইব্রেরি ফাইলগুলি অন্য প্যাকেজে স্থানান্তর না করে কেবল শিপিং করে।

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

আপনি আপনার প্রশ্নে লিঙ্ক করেছেন এইচবিতে জিরার ইস্যুটির শিরোনাম এখানে :

ছায়াযুক্ত নির্ভরতা সহ একটি ক্লায়েন্ট নিদর্শন প্রকাশ করুন

সুতরাং এই পোস্টে আমি 2 টি ধারণাকে বিঘ্নিত না করে উপস্থাপনের চেষ্টা করছি।

ভাল

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

উবার-জারগুলি তৈরির বিভিন্ন উপায় রয়েছে তবে maven-shade-pluginএটির শ্রেণি স্থানান্তরের বৈশিষ্ট্যটি নিয়ে আরও এক ধাপ এগিয়ে যায় :

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

( Noteতিহাসিক দ্রষ্টব্য: জার জার লিংকগুলি সেই স্থানান্তর বৈশিষ্ট্যটি আগে সরবরাহ করেছিল)

সুতরাং এটির সাহায্যে আপনি আপনার লাইব্রেরি নির্ভরতাগুলি বাস্তবায়নের বিশদ হিসাবে তৈরি করতে পারবেন , যদি না আপনি আপনার এপিআইতে libra লাইব্রেরি থেকে ক্লাস উন্মুক্ত করেন।

আসুন ধরা যাক আমার কাছে একটি প্রকল্প রয়েছে, ACME Quantanizer ™, যা DecayingSyncQuantanizerশ্রেণি সরবরাহ করে এবং অ্যাপাচি কমন্স-আরএনজি (কারণ অবশ্যই সঠিকভাবে কোয়ান্টানাইজ করার জন্য আপনার দরকার XorShift1024Star, ডু ) have

যদি আমি একটি উবার-জার তৈরি করতে শেড মাভেন প্লাগইন ব্যবহার করি এবং আমি ভিতরে যা দেখি, আমি এই শ্রেণীর ফাইলগুলি দেখতে পাই:

com/acme/DecayingSyncQuantanizer.class
org/apache/commons/rng/RandomProviderState.class
org/apache/commons/rng/RestorableUniformRandomProvider.class
...
org/apache/commons/rng/core/source64/XorShift1024Star.class
org/apache/commons/rng/core/util/NumberFactory.class

এখন আমি যদি শ্রেণি-স্থান পরিবর্তন বৈশিষ্ট্যটি ব্যবহার করি:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-shade-plugin</artifactId>
  <version>3.0.0</version>
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
        <goal>shade</goal>
      </goals>
      <configuration>
        <relocations>
          <relocation>
            <pattern>org.apache.commons</pattern>
            <shadedPattern>com.acme.shaded.apachecommons</shadedPattern>
          </relocation>
        </relocations>
      </configuration>
    </execution>
  </executions>
</plugin>

উবার-জারের সামগ্রীটি দেখতে এরকম দেখাচ্ছে:

com/acme/DecayingSyncQuantanizer.class
com/acme/shaded/apachecommons/rng/RandomProviderState.class
com/acme/shaded/apachecommons/rng/RestorableUniformRandomProvider.class
...
com/acme/shaded/apachecommons/rng/core/source64/XorShift1024Star.class
com/acme/shaded/apachecommons/rng/core/util/NumberFactory.class

এটি কেবল ফাইলগুলির নাম পরিবর্তন করে নয়, এটি বাইকোডে পুনর্লিখন করে যা স্থানান্তরিত ক্লাসগুলি উল্লেখ করে (সুতরাং, আমার নিজের ক্লাস এবং কমন্স-আরএনজি ক্লাসগুলি সমস্ত রূপান্তরিত হয়েছে)।

তদতিরিক্ত, শেড প্লাগইনটি একটি নতুন পিওএম ( dependency-reduced-pom.xml) তৈরি করবে যার মধ্যে শেডযুক্ত নির্ভরতা <dependencies>বিভাগ থেকে সরানো হবে । এটি অন্য প্রকল্পের নির্ভরতা হিসাবে শেডযুক্ত জারটি ব্যবহার করতে সহায়তা করে। সুতরাং আপনি সেই বেসটি বেসের পরিবর্তে বা উভয় (ছায়াময় জারের জন্য যোগ্যতা ব্যবহার করে) প্রকাশ করতে পারেন ।

যাতে এটি খুব দরকারী হতে পারে ...

খারাপ জন

... তবে এটি বেশ কয়েকটি সমস্যা উত্থাপন করে। জারের মধ্যে সমস্ত নির্ভরতা একক "নেমস্পেসে" একত্রিত করা অগোছালো হয়ে উঠতে পারে এবং সংস্থান এবং ছাঁদ সংস্থানগুলির সাথে সংস্থান প্রয়োজন।

উদাহরণস্বরূপ: ক্লাস বা প্যাকেজের নাম অন্তর্ভুক্ত এমন সংস্থানীয় ফাইলগুলি কীভাবে মোকাবেলা করবেন? রিসোর্স ফাইলগুলি যেমন পরিষেবা সরবরাহকারীর বর্ণনাকারী যা সমস্তের অধীনে থাকে META-INF/services?

শেড প্লাগইন রিসোর্স ট্রান্সফর্মারগুলি সরবরাহ করে যা এর সাথে সহায়তা করতে পারে:

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

তবে এটি এখনও অগোছালো, এবং সমস্যাগুলি অনুমান করা প্রায় অসম্ভব (প্রায়শই আপনি সমস্যাগুলি উত্পাদন ক্ষেত্রে শক্তভাবে আবিষ্কার করেন)। দেখুন কেন-We-বন্ধ বিল্ডিং-চর্বি-বয়াম

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

কুৎসিত

আরও অনেক জটিল সমস্যা রয়েছে (ডিবাগিং, টেস্টিবিলিটি, ওএসজি এবং বহিরাগত ক্লাসলোডারগুলির সাথে সামঞ্জস্যতা ...)।

তবে আরও গুরুত্বপূর্ণ বিষয়, আপনি যখন একটি গ্রন্থাগার তৈরি করেন, তখন আপনি যে বিভিন্ন সমস্যাগুলি নিয়ন্ত্রণ করতে পারেন বলে মনে করেছিলেন তা এখন আরও জটিল হয়ে উঠছে, কারণ আপনার জারটি বিভিন্ন প্রসঙ্গে ব্যবহৃত হবে (কোনও চর্বিযুক্ত জারের মতো নয় যা আপনি স্ট্যান্ডেলোন অ্যাপ / পরিষেবা হিসাবে মোতায়েন করেন) একটি নিয়ন্ত্রিত পরিবেশে)।

উদাহরণস্বরূপ, ইলাস্টিক অনুসন্ধান তারা চালিত জারগুলিতে কিছু নির্ভরতার ছায়া দিত, তবে তারা এটি করা বন্ধ করার সিদ্ধান্ত নিয়েছে :

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

দয়া করে নোট করুন তারাও শেডযুক্ত জার নয়, শেডযুক্ত নির্ভরতাগুলিকে বোঝায়


1
এটি ব্যাখ্যা করার জন্য সময় দেওয়ার জন্য ধন্যবাদ। মাভেন শেড প্লাগইনের আনুষ্ঠানিক ডকুমেন্টেশন সম্পূর্ণরূপে অপ্রতুল এবং এগুলির কোনও বিষয়ে আলোচনা করে না, এমনকি "উবার জার" সংজ্ঞায়িত করতে বিরক্তও করে না। এই ডকুমেন্টেশন অবজ্ঞাপূর্ণ এবং অকেজো। আপনার লিখনআপ দরকারী।
চিজো

দুর্দান্ত ব্যাখ্যা, আমি মনে করি এটি অফিসিয়াল
ডক্সে

7

আমাকে ছায়াময়ী জারগুলি তৈরি করার জন্য দায়ী সফ্টওয়্যারটির সাহায্যে প্রশ্নের উত্তর দিন ... কমপক্ষে ম্যাভেন ব্যবহার করার সময়।

অ্যাপাচি মাভেন শেড প্লাগইন হোম পৃষ্ঠা থেকে নেওয়া :

এই প্লাগইনটি নির্ভরশীলতাগুলিকে একটি উবার-জারে প্যাকেজ করার ক্ষমতা সরবরাহ করে যার সাথে তার নির্ভরতা এবং ছায়া - নামকরণ - কিছু নির্ভরতার কিছু প্যাকেজ রয়েছে।

শেডযুক্ত জার ওরফে উবার-জার ওরফে ফ্যাট জারের মধ্যে ডিফল্টভাবে জাভা অ্যাপ্লিকেশন চালানোর জন্য প্রয়োজনীয় প্রতিটি নির্ভরতা থাকে যাতে কোনও অতিরিক্ত নির্ভরতা ক্লাসপথে থাকতে হবে না। আপনার অ্যাপ্লিকেশনটি চালানোর জন্য আপনার সঠিক জাভা সংস্করণ প্রয়োজন। ছায়াযুক্ত জারটি স্থাপনা / শ্রেণিপথ সমস্যাগুলি এড়াতে সহায়তা করবে, তবে এটি মূল অ্যাপ্লিকেশন জারের তুলনায় অনেক বড় হবে এবং এটি আপনাকে জারক জাহান্নাম এড়াতে সহায়তা করবে না।


1
ভীত এই উত্তরটি অসম্পূর্ণ: এটি ফ্যাট / উবার জারগুলি কী তা ব্যাখ্যা করে তবে শেডিং অংশটি ব্যাখ্যা করে না । এবং হ্যাঁ, শেডিং "জার হেল্ক" (যা এই উত্তরের শেষ অংশটিকে ভুল করে তোলে) সাহায্যে 100% সাহায্য করার কথা বলেছে। সুতরাং এটি কোনও স্তরে কার্যকর তবে বিভ্রান্তি যুক্ত করে: - /
হিউগস এম

1
@ হুগুয়েস মোরেউ আমি আমার প্রতিক্রিয়াতে 100% সম্পূর্ণ নাও হতে পারি, তবে এটি এখনও আমার কাছে আসতে পয়েন্টটি নিয়ে এসেছিল। অনুপস্থিত অংশটি টেবিলে আনার জন্য ধন্যবাদ। শেডিং জার হেল্ক এড়াতে পারবে না, এটাই আমি বোঝাতে চেয়েছিলাম এবং লিখেছিলাম, তবে এটি আপনাকে হাতে এমন কিছু সরঞ্জাম দেবে যা আসুন আপনি এর কয়েকটি সমস্যা সমাধান করুন, তবে এটি স্বয়ংক্রিয় নয়। অন্তত ঠিক আছে, আমি বোঝাতে চেয়েছি এমনভাবে পড়তে এবং ব্যাখ্যা করলে যা শেষ অংশটি করে। :)
জেসকো আর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.