কোনও প্রোগ্রাম কি সংকলনের সময় কোনও লাইব্রেরির উপর নির্ভর করতে পারে তবে রানটাইম নয়?


110

আমি রানটাইম এবং সংকলন-সময়ের মধ্যে পার্থক্য এবং উভয়ের মধ্যে পার্থক্য কীভাবে বুঝতে পারি তা বুঝতে পারি তবে আমি কেবল সংকলন-সময় এবং রানটাইম নির্ভরতার মধ্যে পার্থক্য করার প্রয়োজন দেখছি না ।

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

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

আমার মত একজন দরিদ্র শিপও বুঝতে পারে এমন একটি বাস্তব উদাহরণ সহ, কেউ কি সাধারণের "কিং'র ইংলিশ" টাইপ ব্যাখ্যা দিতে পারে?


2
আপনি প্রতিবিম্ব ব্যবহার করতে পারেন, এবং ক্লাসগুলি ব্যবহার করতে পারেন যা সংকলনের সময় উপলভ্য ছিল না। "প্লাগইন" ভাবুন।
আলেকজান্ডারসন

উত্তর:


64

একটি সংকলন-সময় নির্ভরতা সাধারণত রানটাইমের সময় প্রয়োজন। compileমাভেনে রানটাইমের সময় ক্লাসপথে একটি স্কোপড নির্ভরতা যুক্ত করা হবে (যেমন যুদ্ধে সেগুলি WEB-INF / lib এ অনুলিপি করা হবে)।

এটি অবশ্য কঠোরভাবে প্রয়োজন হয় না; উদাহরণস্বরূপ, আমরা একটি নির্দিষ্ট এপিআইয়ের তুলনায় এটি সংকলন করতে পারি, এটি একটি সংকলন-সময় নির্ভরতা তৈরি করে, তবে রানটাইমের সময় এমন একটি বাস্তবায়ন অন্তর্ভুক্ত করে যা এপিআইও অন্তর্ভুক্ত করে।

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

অন্যদিকে, রানটাইম নির্ভরতা সহ যা সংকলন-সময়ে প্রয়োজন হয় না তা খুব সাধারণ। উদাহরণস্বরূপ, আপনি যদি জাভা EE 6 অ্যাপ্লিকেশন লিখছেন, আপনি জাভা EE 6 API এর বিরুদ্ধে সংকলন করুন, তবে রানটাইমের সময়, কোনও জাভা EE ধারক ব্যবহার করা যেতে পারে; এটি এই ধারক যা বাস্তবায়ন সরবরাহ করে।

সংকলন-সময় নির্ভরতা প্রতিবিম্ব ব্যবহার করে এড়ানো যায়। উদাহরণস্বরূপ, একটি জেডিবিসি ড্রাইভারকে একটি দিয়ে লোড করা যেতে পারে Class.forNameএবং একটি আসল ক্লাস লোড হওয়া একটি কনফিগারেশন ফাইলের মাধ্যমে কনফিগারযোগ্য হতে পারে।


17
জাভা ইই এপিআই সম্পর্কে - "সরবরাহিত" নির্ভরতার সুযোগটি কি তা নয়?
কেভিন

15
উদাহরণস্বরূপ যেখানে সংকলনের জন্য নির্ভরতা প্রয়োজন তবে রানটাইমের সময় প্রয়োজন নেই তা হ'ল লম্বোক (www.projectlombok.org)। জারটি সংকলনের সময় জাভা কোডটি রূপান্তর করতে ব্যবহৃত হয় তবে রানটাইম এ মোটেই প্রয়োজন হয় না। স্কোপ "প্রদত্ত" নির্দিষ্ট করে দেওয়ার কারণে জারটি যুদ্ধ / জারে অন্তর্ভুক্ত করা যায় না।
কেভিন

2
@ কেভিন হ্যাঁ, ভাল কথা, providedসুযোগটি রানটাইম নির্ভরতা অন্য উপায়ে (যেমন ধারকটিতে একটি ভাগ করে নেওয়া লাইব্রেরি) সরবরাহ করা হবে এই প্রত্যাশায় রানটাইম নির্ভরতা না যুক্ত করে একটি সংকলন সময় নির্ভরতা যুক্ত করে। runtimeঅন্যদিকে এটি একটি সংকলন-সময় নির্ভরতা না করে একটি রানটাইম নির্ভরতা যুক্ত করে।
আর্টেফ্যাক্টো

তাহলে কি এটি নিরাপদে বলা যায় যে আপনার প্রকল্পের মূলের অধীনে একটি "মডিউল কনফিগারেশন" (আইভির শর্তাদি ব্যবহার করে) এবং প্রধান ডিরেক্টরিগুলির মধ্যে সাধারণত 1: 1 সম্পর্ক রয়েছে? উদাহরণস্বরূপ, আমার সমস্ত JUnit পরীক্ষাগুলি যে JUnit JAR এর উপর নির্ভর করে তা পরীক্ষার / মূলের অধীনে থাকবে ইত্যাদি I আমি কেবল দেখতে পাচ্ছি না যে একই উত্সের মূলের অধীনে প্যাকেজ করা একই ক্লাসগুলি কীভাবে আলাদাভাবে নির্ভর করতে "কনফিগার করা" যেতে পারে যে কোনও সময় জআর। আপনার যদি লগ 4 জ দরকার হয় তবে আপনার প্রয়োজন লগ 4 জ; 1 টি কনফিগারেশনের অধীনে লগ 4 জে কল আহ্বান করার জন্য একই কোডটি বলার উপায় নেই, তবে কিছু "নন-লগিং" কনফিগারেশনের অধীনে লগ 4 জে কল উপেক্ষা করার অধিকার আছে, তাই না?
IAmYourFaja

30

প্রতিটি মাভেন নির্ভরতার একটি সুযোগ রয়েছে যা কোন শ্রেণিপথের উপর নির্ভর করে যে নির্ভরতা উপলব্ধ।

আপনি যখন কোনও প্রকল্পের জন্য একটি জেআর তৈরি করেন, তখন নির্ভরতা উত্পন্ন শিল্পকর্মের সাথে বান্ডিল হয় না; সেগুলি কেবল সংকলনের জন্য ব্যবহৃত হয়। (তবে, আপনি এখনও মাভেন তৈরি জার মধ্যে নির্ভরতা অন্তর্ভুক্ত করতে পারেন, দেখুন: মাভেনের সাথে একটি জারে নির্ভরতা সহ )

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

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

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

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


@ কোরে তুগাই উত্তরটি আরও সুনির্দিষ্ট :) আমার দ্রুত প্রশ্ন রয়েছে যে আমার কাছে নির্ভরশীল জার ডাব্লু / রান সময়ের সুযোগ রয়েছে। সঙ্কলনের সময় কি মাভেন জারের সন্ধান করবে?
11:48

@gks না, সংকলনের সময় এটির প্রয়োজন হবে না।
Koray Tugay

9

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

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


আপনি কি আমাদের এই জাতীয় লাইব্রেরির উদাহরণ দিতে পারেন যেগুলি সংকলনের প্রয়োজন হবে না তবে রানটাইমের সময় প্রয়োজন হবে?
ক্রিশ্চিয়ানো

1
@ ক্রিশ্চিয়ানো সমস্ত জেডিবিসি লাইব্রেরি এর মত। এছাড়াও লাইব্রেরিগুলি যা একটি স্ট্যান্ডার্ড এপিআই প্রয়োগ করে।
পিটার লরি

4

সাধারণত আপনি সঠিক এবং সম্ভবত রানটাইম এবং সংকলনের সময় নির্ভরতা অভিন্ন হলে এটি আদর্শ পরিস্থিতি।

এই নিয়মটি ভুল হলে আমি আপনাকে 2 টি উদাহরণ দেব।

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

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

আমি আশা করি আমার ব্যাখ্যা সাহায্য করবে।


আপনার উদাহরণে সংকলনের সময় কেন সি প্রয়োজন হয় তা আপনি বিশদ বর্ণনা করতে পারেন? আমি ধারণাটি পেয়েছি ( স্ট্যাকওভারফ্লো.com/a/7257518/6095334 থেকে ) যে সংকলন সময়ে সি প্রয়োজন হয় কিনা তা কোন পদ্ধতি এবং ক্ষেত্রগুলির (বি থেকে) এ উল্লেখ করছে তার উপর নির্ভর করে।
হারভিয়ান

3

সাধারণত, স্ট্যাটিক নির্ভরতা গ্রাফ গতিশীল এক উপ-গ্রাফ হয়, যেমন দেখতে NDepend লেখক থেকে এই ব্লগ এন্ট্রি

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


2

কেবল একটি ইস্যুতে দৌড়ে গেছে যা আপনার প্রশ্নের উত্তর দেয়। servlet-api.jarআমার ওয়েব প্রকল্পে একটি ক্ষণস্থায়ী নির্ভরতা এবং সংকলন সময় এবং রানটাইম উভয়ই প্রয়োজন। তবে servlet-api.jarএটি আমার টোম্যাট লাইব্রেরিতে অন্তর্ভুক্ত রয়েছে।

এখানে সমাধানটি হ'ল servlet-api.jarমাভেনকে কেবল সংকলনের সময় উপলভ্য করা এবং আমার যুদ্ধের ফাইলে প্যাকেজ না করা যাতে এটি servlet-api.jarআমার টমক্যাট লাইব্রেরিতে থাকা সংস্থার সাথে সংঘাত না ঘটে ।

আমি আশা করি এটি সংকলন সময় এবং রানটাইম নির্ভরতা ব্যাখ্যা করে।


3
কারণ এটা মধ্যে পার্থক্য ব্যাখ্যা করে আপনাদের উদাহরণ, আসলে দেওয়া প্রশ্নের জন্য ভুল compileএবং providedসুযোগ এবং তাদের মধ্যে না compileএবং runtimeCompile scopeউভয়ই সংকলন সময়ে প্রয়োজন এবং আপনার অ্যাপ্লিকেশন মধ্যে প্যাক করা হয়। Provided scopeকেবল সংকলনের সময় প্রয়োজন তবে এটি আপনার অ্যাপ্লিকেশনে প্যাকেজ করা হয়নি কারণ এটি অন্য মাধ্যমে সরবরাহ করা হয়েছে, উদাহরণস্বরূপ এটি টমক্যাট সার্ভারে ইতিমধ্যে রয়েছে।
এম জার

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

1

আমি রানটাইম এবং সংকলন-সময়ের মধ্যে পার্থক্য এবং উভয়ের মধ্যে পার্থক্য কীভাবে বুঝতে পারি তা বুঝতে পারি তবে আমি কেবল সংকলন-সময় এবং রানটাইম নির্ভরতাগুলির মধ্যে পার্থক্য করার প্রয়োজন দেখছি না।

সাধারণ সংকলন-সময় এবং রানটাইম ধারণা এবং মাভেন নির্দিষ্ট compileএবং runtimeস্কোপ নির্ভরতা দুটি খুব আলাদা জিনিস different এগুলি একই ফ্রেম না থাকায় আপনি সরাসরি তাদের তুলনা করতে পারবেন না: সাধারণ সংকলন এবং রানটাইম ধারণাগুলি বিস্তৃত হয় যখন মভেন compileএবং runtimeস্কোপ ধারণাগুলি নির্দিষ্টভাবে নির্ভর করে সময় অনুযায়ী নির্ভরতা উপলব্ধতা / দৃশ্যমানতা: সংকলন বা সম্পাদন।
ভুলে যাবেন না যে মাভেন সমস্ত javac/ javaর‌্যাপারের উপরে এবং জাভাতে আপনার একটি সংকলন টাইম ক্লাসপাথ রয়েছে যা আপনি নির্দিষ্ট করেছেন javac -cp ... এবং একটি রানটাইম ক্লাসপথ যা আপনি নির্দিষ্ট করেছেন java -cp ...। জাভা সংকলন এবং রানটাইম ক্লাসপাথে উভয়ই নির্ভরতা যুক্ত করার উপায় হিসাবে ম্যাভেন স্কোপটিকে
বিবেচনা করা ভুল হবে না compile(javacএবং java) যখন ম্যাভেন runtimeস্কোপটি কেবল জাভা রানটাইম ক্লাসপ্যাথ ( javac) তে নির্ভরতা যুক্ত করার উপায় হিসাবে দেখা যেতে পারে ।

আমি যা ঘাটাঘাটি করছি তা হ'ল: সংকলনের সময় কোনও প্রোগ্রাম কীভাবে রানটাইমের সময় এমন কোনও কিছুর উপর নির্ভর করতে পারে না?

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

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

এই ক্ষেত্রে হ্যাঁ। তবে মনে করুন যে আপনাকে একটি পোর্টেবল কোড লিখতে হবে যা পরে অন্য লগিং প্রয়োগের দিকে যেতে (লগ 4 জ 2, লগব্যাক বা অন্য কোনও) সারণী করতে log4j এর সামনের দিকে মুখ হিসাবে Slf4j এর উপর নির্ভর করে।
আপনি পম ক্ষেত্রে এই ক্ষেত্রে আপনাকে compileনির্ভরতা হিসাবে slf4j নির্দিষ্ট করতে হবে (এটি ডিফল্ট) তবে আপনি লগ 4j নির্ভরতা নির্ভরতা হিসাবে নির্দিষ্ট করবেন runtime:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>...</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>...</version>
    <scope>runtime</scope>
</dependency>

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

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>...</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>...</version>
</dependency>

runtimeসুযোগের একটি সাধারণ ব্যবহার হল জেডিবিসি নির্ভরতা ঘোষণা decla পোর্টেবল কোড লেখার জন্য, আপনি চান না যে ক্লায়েন্ট কোড নির্দিষ্ট ডিবিএমএস নির্ভরতার ক্লাসগুলি উল্লেখ করতে পারে (উদাহরণস্বরূপ: পোস্টগ্রিসএসকিউএল জেডিবিসি নির্ভরতা) তবে আপনি রানটাইম হিসাবে ক্লাসগুলি তৈরি করার জন্য প্রয়োজনীয় সমস্ত প্রয়োগগুলিকে আপনার প্রয়োগে অন্তর্ভুক্ত করতে চান জেডিবিসি এপিআই এই ডিবিএমএসের সাথে কাজ করে।


0

সংকলনের সময় আপনি চুক্তি / এপিআই সক্ষম করে থাকেন যা আপনার নির্ভরতা থেকে প্রত্যাশিত। (যেমন: এখানে আপনি ব্রডব্যান্ড ইন্টারনেট সরবরাহকারীর সাথে চুক্তির জন্য সাইন ইন করুন) রান-টাইমে আসলে আপনি নির্ভরতা ব্যবহার করছেন। (যেমন: এখানে আপনি আসলে ব্রডব্যান্ড ইন্টারনেট ব্যবহার করছেন)


0

"একটি প্রোগ্রাম সংকলনের সময় রানটাইমের সময় যে কোনও কিছুর উপর নির্ভর করতে পারে না?" এই প্রশ্নের উত্তর দেওয়ার জন্য আসুন একটি এনোটেশন প্রসেসরের উদাহরণটি দেখুন।

ধরুন আপনি নিজের টিকা প্রসেসরটি লিখেছেন এবং ধরুন এটিতে একটি কম্পাইল-টাইম নির্ভরতা রয়েছে com.google.auto.service:auto-serviceযাতে এটি ব্যবহার করতে পারে @AutoService। এই নির্ভরতা কেবলমাত্র টীকা প্রসেসর সংকলন করার জন্য প্রয়োজন, তবে রানটাইমের সময় এটি প্রয়োজন হয় না: টীকাগুলি প্রসেসিংয়ের জন্য আপনার টিকা প্রসেসরের উপর নির্ভর করে অন্যান্য সমস্ত প্রকল্পের উপর নির্ভরতা প্রয়োজন হয় নাcom.google.auto.service:auto-service রানটাইমের (সংকলন-সময় বা অন্য কোনও সময়ে) ।

এটি খুব সাধারণ নয়, তবে এটি ঘটে।


0

runtimeসুযোগ পরিবর্তে কোডে বাস্তবায়ন লাইব্রেরি সরাসরি নির্ভরতা যোগ বিমূর্ত বা ফেসেড ব্যবহার থেকে প্রোগ্রামারদের প্রতিরোধ নেই।

অন্য কথায়, এটি ইন্টারফেস ব্যবহার করতে প্রয়োগ করে।

কংক্রিট উদাহরণ:

1) আপনার দলটি লগ 4 জেতে এসএলএফ 4 জে ব্যবহার করছে। আপনি চান যে আপনার প্রোগ্রামাররা SLF4J এপিআই ব্যবহার করুন, লগ 4 জে না। লগ 4 জে অভ্যন্তরীণভাবে কেবল এসএলএফ 4 জে ব্যবহার করতে হবে। সমাধান:

  • নিয়মিত সংকলন-সময় নির্ভরতা হিসাবে এসএলএফ 4 জে সংজ্ঞা দিন
  • লগ 4 জে-কোর এবং লগ 4 জে-এপি রানটাইম নির্ভরতা হিসাবে সংজ্ঞায়িত করুন।

2) আপনার অ্যাপ্লিকেশনটি জেডিবিসি ব্যবহার করে মাইএসকিউএল অ্যাক্সেস করছে। আপনি চান যে আপনার প্রোগ্রামাররা স্ট্যান্ডার্ড জেডিবিসি বিমূর্তির বিরুদ্ধে কোড করুন, সরাসরি মাইএসকিউএল ড্রাইভার প্রয়োগের বিরুদ্ধে নয়।

  • mysql-connector-java(মাইএসকিউএল জেডিবিসি ড্রাইভার) একটি রানটাইম নির্ভরতা হিসাবে সংজ্ঞায়িত করুন ।

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.