Maven একটি শক্তিশালী বিল্ড টুল যা Java প্রোজেক্টগুলির জন্য ডিপেনডেন্সি ম্যানেজমেন্ট এবং বিল্ড প্রক্রিয়া সহজ করে তোলে। Maven Dependency Scope একটি অত্যন্ত গুরুত্বপূর্ণ ফিচার যা নির্ধারণ করে যে, একটি নির্দিষ্ট লাইব্রেরি বা ডিপেনডেন্সি কোডের কোন অংশে এবং কখন ব্যবহৃত হবে।
Dependency Scope হল একটি নির্দিষ্ট লাইব্রেরি বা ডিপেনডেন্সির প্রোজেক্টের মধ্যে ব্যবহারের পরিসর নির্ধারণকারী একটি প্যারামিটার। এটি বলে দেয় কোন ডিপেনডেন্সি কখন এবং কোথায় অ্যাক্সেস করা যাবে এবং কোডের কোন পরিবেশে (যেমন, কম্পাইল, টেস্ট, প্রোডাকশন) ব্যবহৃত হবে।
Maven-এ বেশ কিছু scope রয়েছে, যার মধ্যে কয়েকটি জনপ্রিয় compile, provided, runtime, test, system, এবং import।
compile
Scopecompile
scope হল ডিফল্ট স্কোপ, যা ব্যবহার না করলে মেভেন নিজে থেকেই compile
স্কোপ ধরবে। ডিপেনডেন্সি compile
স্কোপে যুক্ত থাকলে এটি প্রোজেক্টের compile, runtime, এবং test সব স্টেজে ব্যবহার করা যাবে।
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.0.0</version>
</dependency>
এখানে, spring-core
ডিপেনডেন্সি compile
স্কোপে থাকবে, যা প্রোজেক্টের সব সময় ব্যবহারযোগ্য হবে।
provided
Scopeprovided
scope হল এমন ডিপেনডেন্সি যেগুলি কম্পাইল এবং টেস্ট সময় প্রয়োজন, তবে রানটাইম সময়ে আপনি এটি সরবরাহ করবেন (সাধারণত Servlet Containers বা Web Servers)। এটি compile
স্কোপে কাজ করবে তবে প্রোডাকশন পরিবেশে এটি ব্যবহৃত হবে না, কারণ পরিবেশে এটি আগে থেকেই উপস্থিত থাকে।
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
এখানে, javax.servlet-api
ডিপেনডেন্সি provided
স্কোপে রাখা হয়েছে, যার মানে এটি রানটাইমে সরবরাহ করা হবে।
runtime
Scoperuntime
scope হল এমন ডিপেনডেন্সি যা প্রোজেক্টের runtime সময়ে প্রয়োজন, তবে কম্পাইল সময় নয়। এই ডিপেনডেন্সি কোড কম্পাইলের সময় ব্যবহৃত হয় না, তবে অ্যাপ্লিকেশন চালানোর সময় এটি প্রয়োজন।
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
<scope>runtime</scope>
</dependency>
এখানে, mysql-connector-java
ডিপেনডেন্সি runtime
স্কোপে রাখা হয়েছে, যা রানটাইমে ব্যবহৃত হবে।
test
Scopetest
scope হল এমন ডিপেনডেন্সি যেগুলি শুধুমাত্র unit testing বা integration testing এর সময় প্রয়োজন। এটি শুধুমাত্র টেস্ট কোডের জন্য ব্যবহৃত হয় এবং প্রোডাকশন পরিবেশে বা রানটাইমে এটি ব্যবহৃত হয় না।
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
<scope>test</scope>
</dependency>
এখানে, JUnit
ডিপেনডেন্সি শুধুমাত্র টেস্টিং স্কোপে ব্যবহৃত হবে।
system
Scopesystem
scope হল একটি বিশেষ স্কোপ যেখানে ডিপেনডেন্সি সরাসরি আপনার সিস্টেমের ফাইল সিস্টেম থেকে ব্যবহার করা হয়, সাধারণত কোনো নির্দিষ্ট স্থানে রাখা ফাইল। এটি সাধারণত ব্যবহার করা হয় যদি আপনার ডিপেনডেন্সি কোন পাবলিক রেপোজিটরিতে না থাকে এবং আপনাকে সেগুলি সরাসরি আপনার সিস্টেম থেকে ব্যবহারের প্রয়োজন হয়।
<dependency>
<groupId>com.example</groupId>
<artifactId>my-library</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/libs/my-library.jar</systemPath>
</dependency>
এখানে, my-library.jar
সরাসরি সিস্টেমের একটি ফাইল পাথ থেকে ব্যবহৃত হবে।
import
Scopeimport
scope শুধুমাত্র Maven BOM (Bill of Materials) এর জন্য ব্যবহৃত হয়, যা নির্দিষ্ট ডিপেনডেন্সির গ্রুপ বা ভার্সন রেঞ্জ নির্ধারণ করতে সাহায্য করে।
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-bom</artifactId>
<version>3.8.1</version>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
এখানে, maven-bom
ডিপেনডেন্সি import
স্কোপে ব্যবহার করা হয়েছে।
Maven Dependency Scope হল একটি অত্যন্ত গুরুত্বপূর্ণ বৈশিষ্ট্য যা আপনাকে নির্ধারণ করতে সহায়তা করে কোন লাইব্রেরি বা ডিপেনডেন্সি কোন সময় এবং কোথায় ব্যবহৃত হবে। আপনি compile, provided, runtime, test, system, এবং import এর মাধ্যমে ডিপেনডেন্সি ম্যানেজমেন্ট করতে পারেন। প্রতিটি স্কোপের ভিন্ন ব্যবহার রয়েছে এবং প্রোজেক্টের প্রয়োজনীয়তা অনুসারে স্কোপ নির্বাচন করা উচিত।
Maven একটি শক্তিশালী বিল্ড টুল যা Java প্রোজেক্টগুলির জন্য ডিপেনডেন্সি ম্যানেজমেন্ট এবং বিল্ড প্রক্রিয়া সহজ করে তোলে। Maven Dependency Scope একটি অত্যন্ত গুরুত্বপূর্ণ ফিচার যা নির্ধারণ করে যে, একটি নির্দিষ্ট লাইব্রেরি বা ডিপেনডেন্সি কোডের কোন অংশে এবং কখন ব্যবহৃত হবে।
Dependency Scope হল একটি নির্দিষ্ট লাইব্রেরি বা ডিপেনডেন্সির প্রোজেক্টের মধ্যে ব্যবহারের পরিসর নির্ধারণকারী একটি প্যারামিটার। এটি বলে দেয় কোন ডিপেনডেন্সি কখন এবং কোথায় অ্যাক্সেস করা যাবে এবং কোডের কোন পরিবেশে (যেমন, কম্পাইল, টেস্ট, প্রোডাকশন) ব্যবহৃত হবে।
Maven-এ বেশ কিছু scope রয়েছে, যার মধ্যে কয়েকটি জনপ্রিয় compile, provided, runtime, test, system, এবং import।
compile
Scopecompile
scope হল ডিফল্ট স্কোপ, যা ব্যবহার না করলে মেভেন নিজে থেকেই compile
স্কোপ ধরবে। ডিপেনডেন্সি compile
স্কোপে যুক্ত থাকলে এটি প্রোজেক্টের compile, runtime, এবং test সব স্টেজে ব্যবহার করা যাবে।
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.0.0</version>
</dependency>
এখানে, spring-core
ডিপেনডেন্সি compile
স্কোপে থাকবে, যা প্রোজেক্টের সব সময় ব্যবহারযোগ্য হবে।
provided
Scopeprovided
scope হল এমন ডিপেনডেন্সি যেগুলি কম্পাইল এবং টেস্ট সময় প্রয়োজন, তবে রানটাইম সময়ে আপনি এটি সরবরাহ করবেন (সাধারণত Servlet Containers বা Web Servers)। এটি compile
স্কোপে কাজ করবে তবে প্রোডাকশন পরিবেশে এটি ব্যবহৃত হবে না, কারণ পরিবেশে এটি আগে থেকেই উপস্থিত থাকে।
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
এখানে, javax.servlet-api
ডিপেনডেন্সি provided
স্কোপে রাখা হয়েছে, যার মানে এটি রানটাইমে সরবরাহ করা হবে।
runtime
Scoperuntime
scope হল এমন ডিপেনডেন্সি যা প্রোজেক্টের runtime সময়ে প্রয়োজন, তবে কম্পাইল সময় নয়। এই ডিপেনডেন্সি কোড কম্পাইলের সময় ব্যবহৃত হয় না, তবে অ্যাপ্লিকেশন চালানোর সময় এটি প্রয়োজন।
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
<scope>runtime</scope>
</dependency>
এখানে, mysql-connector-java
ডিপেনডেন্সি runtime
স্কোপে রাখা হয়েছে, যা রানটাইমে ব্যবহৃত হবে।
test
Scopetest
scope হল এমন ডিপেনডেন্সি যেগুলি শুধুমাত্র unit testing বা integration testing এর সময় প্রয়োজন। এটি শুধুমাত্র টেস্ট কোডের জন্য ব্যবহৃত হয় এবং প্রোডাকশন পরিবেশে বা রানটাইমে এটি ব্যবহৃত হয় না।
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
<scope>test</scope>
</dependency>
এখানে, JUnit
ডিপেনডেন্সি শুধুমাত্র টেস্টিং স্কোপে ব্যবহৃত হবে।
system
Scopesystem
scope হল একটি বিশেষ স্কোপ যেখানে ডিপেনডেন্সি সরাসরি আপনার সিস্টেমের ফাইল সিস্টেম থেকে ব্যবহার করা হয়, সাধারণত কোনো নির্দিষ্ট স্থানে রাখা ফাইল। এটি সাধারণত ব্যবহার করা হয় যদি আপনার ডিপেনডেন্সি কোন পাবলিক রেপোজিটরিতে না থাকে এবং আপনাকে সেগুলি সরাসরি আপনার সিস্টেম থেকে ব্যবহারের প্রয়োজন হয়।
<dependency>
<groupId>com.example</groupId>
<artifactId>my-library</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/libs/my-library.jar</systemPath>
</dependency>
এখানে, my-library.jar
সরাসরি সিস্টেমের একটি ফাইল পাথ থেকে ব্যবহৃত হবে।
import
Scopeimport
scope শুধুমাত্র Maven BOM (Bill of Materials) এর জন্য ব্যবহৃত হয়, যা নির্দিষ্ট ডিপেনডেন্সির গ্রুপ বা ভার্সন রেঞ্জ নির্ধারণ করতে সাহায্য করে।
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-bom</artifactId>
<version>3.8.1</version>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
এখানে, maven-bom
ডিপেনডেন্সি import
স্কোপে ব্যবহার করা হয়েছে।
Maven Dependency Scope হল একটি অত্যন্ত গুরুত্বপূর্ণ বৈশিষ্ট্য যা আপনাকে নির্ধারণ করতে সহায়তা করে কোন লাইব্রেরি বা ডিপেনডেন্সি কোন সময় এবং কোথায় ব্যবহৃত হবে। আপনি compile, provided, runtime, test, system, এবং import এর মাধ্যমে ডিপেনডেন্সি ম্যানেজমেন্ট করতে পারেন। প্রতিটি স্কোপের ভিন্ন ব্যবহার রয়েছে এবং প্রোজেক্টের প্রয়োজনীয়তা অনুসারে স্কোপ নির্বাচন করা উচিত।
Maven এর Dependency Scope বিভিন্ন ধরণের ডিপেনডেন্সির আচরণ এবং ব্যবহারকে নিয়ন্ত্রণ করে। বিভিন্ন Scope ডিপেনডেন্সি ব্যবস্থাপনা, কম্পাইল, টেস্ট এবং রানটাইম পর্যায়ে কিভাবে ডিপেনডেন্সি কার্যকরী হবে তা নির্ধারণ করে।
এখানে আমরা Compile, Provided, Runtime, Test, এবং System Scope এর বিষয়ে বিস্তারিত আলোচনা করব এবং কীভাবে এগুলি Maven প্রকল্পে কাজ করে তা দেখাব।
Compile Scope হল ডিফল্ট স্কোপ যা Maven এর মধ্যে ব্যবহৃত হয় যদি অন্য কোনো স্কোপ উল্লেখ না করা হয়। এই স্কোপে নির্দিষ্ট করা ডিপেনডেন্সি কম্পাইল এবং রানটাইম উভয় পর্যায়ে উপলব্ধ থাকে। এই স্কোপে থাকা ডিপেনডেন্সি আপনার প্রকল্পের সোর্স কোড কম্পাইল করার সময় এবং প্রকল্প রান করার সময় ব্যবহার করা হবে।
<dependency>
<groupId>com.example</groupId>
<artifactId>library</artifactId>
<version>1.0.0</version>
<scope>compile</scope>
</dependency>
এখানে compile
স্কোপের ডিপেনডেন্সি উভয় কম্পাইল এবং রানটাইম পর্যায়ে পাওয়া যাবে।
Provided Scope হল এমন একটি স্কোপ যা শুধুমাত্র কম্পাইল এবং টেস্ট সময় প্রয়োজন হয়, কিন্তু রানটাইম সময় আপনাকে সেই ডিপেনডেন্সি সরবরাহ করতে হবে। এই স্কোপ সাধারণত সার্ভার নির্ভর ডিপেনডেন্সির জন্য ব্যবহৃত হয়, যেমন Servlet API বা JSP API, যেখানে সেই সার্ভিসটি আপনার অ্যাপ্লিকেশনে সরবরাহ করা না হলেও সার্ভার বা কন্টেইনারে এটি সরবরাহ করা থাকে।
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
এখানে Servlet API কম্পাইল এবং টেস্টের সময় প্রয়োজন, কিন্তু এটি সরাসরি অ্যাপ্লিকেশন দ্বারা সরবরাহিত হবে না, কারণ এটি সার্ভার দ্বারা সরবরাহ করা হয়।
Runtime Scope হল এমন একটি স্কোপ যা রানটাইম সময় প্রয়োজন, তবে কম্পাইল সময় নয়। এটি সাধারণত সেই ডিপেনডেন্সির জন্য ব্যবহৃত হয় যেগুলি প্রকল্প কম্পাইল করার সময় প্রয়োজন হয় না, তবে রানটাইম সময় অ্যাপ্লিকেশন চালানোর জন্য প্রয়োজন।
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
<scope>runtime</scope>
</dependency>
এখানে, commons-io শুধুমাত্র রানটাইমে প্রয়োজন, কিন্তু এটি কম্পাইলিং এর সময় ব্যবহার করা হবে না।
Test Scope হল এমন একটি স্কোপ যা শুধুমাত্র টেস্টিং সময়ে ব্যবহৃত হয়। এটি এমন ডিপেনডেন্সি জন্য ব্যবহৃত হয় যেগুলি শুধুমাত্র আপনার টেস্ট ক্লাসের জন্য প্রয়োজন এবং প্রোডাকশন কোডে তাদের কোন প্রভাব নেই।
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.7.1</version>
<scope>test</scope>
</dependency>
এখানে JUnit ডিপেনডেন্সি শুধুমাত্র টেস্টিং সময় ব্যবহার করা হবে এবং এটি রানটাইম বা কম্পাইল পর্যায়ে অন্তর্ভুক্ত হবে না।
System Scope হল একটি বিশেষ স্কোপ যা আপনার প্রকল্পের জন্য সিস্টেম নির্দিষ্ট ডিপেনডেন্সি ব্যবহারের ক্ষেত্রে ব্যবহৃত হয়। এটি একটি হার্ড ডিপেনডেন্সি যা সাধারণত লোকাল মেশিন বা সিস্টেমে থাকে এবং Maven এর রিপোজিটরি থেকে ডাউনলোড করা হয় না। এই স্কোপের ডিপেনডেন্সির পাথ (path) সরাসরি নির্দিষ্ট করা হয়।
<dependency>
<groupId>com.example</groupId>
<artifactId>local-library</artifactId>
<version>1.0.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/local-library.jar</systemPath>
</dependency>
এখানে, local-library.jar
ফাইলটি লোকাল সিস্টেম থেকে সরাসরি ব্যবহার করা হচ্ছে এবং Maven রিপোজিটরি থেকে এটি ডাউনলোড হবে না।
Maven এ Scope ডিপেনডেন্সি ব্যবস্থাপনার গুরুত্বপূর্ণ অংশ। এটি নিয়ন্ত্রণ করে কিভাবে ডিপেনডেন্সি বিভিন্ন পর্যায়ে ব্যবহৃত হবে:
Maven-এ সঠিক Scope নির্বাচন করা প্রোজেক্টের ডিপেনডেন্সি ব্যবস্থাপনা এবং পারফরম্যান্সে বড় প্রভাব ফেলতে পারে।
Maven একটি শক্তিশালী বিল্ড এবং প্রোজেক্ট ম্যানেজমেন্ট টুল যা Java প্রোজেক্টের জন্য ব্যবহৃত হয়। Dependency Management হল Maven-এর অন্যতম শক্তিশালী ফিচার, যা প্রোজেক্টের ডিপেনডেন্সি এবং লাইব্রেরি পরিচালনা সহজ করে তোলে। একটি গুরুত্বপূর্ণ বৈশিষ্ট্য হলো Transitive Dependency, যা Maven প্রোজেক্টে এক Dependency-এর সাথে সম্পর্কিত অন্যান্য ডিপেনডেন্সির জন্য দায়ী।
Transitive Dependency হল একটি অবরোহী ডিপেনডেন্সি, যা এক Dependency-তে থাকা অন্য ডিপেনডেন্সির মাধ্যমে আসে। সহজভাবে বলতে গেলে, যখন আপনার প্রোজেক্টে একটি লাইব্রেরি থাকে যা অন্য লাইব্রেরি বা ডিপেনডেন্সির উপর নির্ভরশীল, তখন সেই নির্ভরশীল লাইব্রেরি আপনার প্রোজেক্টে স্বয়ংক্রিয়ভাবে যুক্ত হয়, যদিও আপনি সরাসরি সেটি উল্লেখ করেননি। এটিকে transitive dependency বলা হয়।
ধরা যাক, আপনার প্রোজেক্টে একটি লাইব্রেরি Library A
যুক্ত রয়েছে। এই Library A
একটি অন্য লাইব্রেরি Library B
এর উপর নির্ভরশীল। আপনি যদি শুধু Library A
আপনার প্রোজেক্টে যোগ করেন, তবে Library B
স্বয়ংক্রিয়ভাবে আপনার প্রোজেক্টে যোগ হয়ে যাবে, কারণ এটি Library A
এর transitive dependency।
<dependency>
<groupId>com.example</groupId>
<artifactId>library-a</artifactId>
<version>1.0</version>
</dependency>
এখানে Library A
এ Library B
transitive dependency হিসেবে যোগ হবে।
Transitive dependencies আপনার প্রোজেক্টের ডিপেনডেন্সি ম্যানেজমেন্টে কিছু সুবিধা এবং কিছু চ্যালেঞ্জ তৈরি করতে পারে। এগুলোর প্রভাবকে নিচে বিস্তারিতভাবে আলোচনা করা হলো:
Maven এর সবচেয়ে বড় সুবিধা হলো এটি Transitive Dependency কে স্বয়ংক্রিয়ভাবে ম্যানেজ করে। অর্থাৎ, যখন আপনি একটি ডিপেনডেন্সি যুক্ত করেন, Maven এটি সম্পর্কিত অন্যান্য ডিপেনডেন্সি (transitive dependencies) স্বয়ংক্রিয়ভাবে আপনার প্রোজেক্টে যুক্ত করে দেয়, ফলে আপনাকে একটি dependency-এর জন্য অন্য সমস্ত নির্ভরশীল লাইব্রেরি ম্যানুয়ালি যোগ করতে হয় না।
যদি Library A
এর জন্য Library B
এবং Library C
লাগবে, তবে আপনি শুধুমাত্র Library A
উল্লেখ করলে, Maven নিজেই Library B
এবং Library C
আপনার প্রোজেক্টে যুক্ত করে দেবে।
Transitive dependency ব্যবহারের একটি নেতিবাচক প্রভাব হল version conflict। যদি আপনার সরাসরি প্রোজেক্টে একটি লাইব্রেরি থাকে, এবং সেই লাইব্রেরি অন্য কোনো লাইব্রেরি (যা আপনার ট্রানজিটিভ ডিপেনডেন্সি) ব্যবহার করে অন্য একটি ভার্সন, তাহলে ভার্সন কনফ্লিক্ট তৈরি হতে পারে। এর ফলে কোনো লাইব্রেরির ফিচার বা API কম্প্যাটিবিলিটি সমস্যায় পরতে পারে।
ধরা যাক, আপনি Library A
ব্যবহার করছেন, যা Library B
এর ভার্সন 1.0 এর উপর নির্ভরশীল, এবং আপনি অন্য একটি লাইব্রেরি Library C
ব্যবহার করছেন, যা Library B
এর ভার্সন 2.0 এর উপর নির্ভরশীল। Maven তখন কোন ভার্সনটি ব্যবহার করবে তা নির্ধারণ করার জন্য dependency mediation
ব্যবহার করে, তবে যদি দুইটি ভার্সন একসাথে উপস্থিত থাকে তবে এটি সমস্যা তৈরি করতে পারে।
যেহেতু ট্রানজিটিভ ডিপেনডেন্সি হল ডিপেনডেন্সির মাধ্যমে অন্য ডিপেনডেন্সি যোগ হওয়া, এটি আপনার প্রোজেক্টের আকার বৃদ্ধি করতে পারে, কারণ আপনি সরাসরি যে লাইব্রেরিগুলোর সাথে কাজ করেন না, সেগুলিও আপনার প্রোজেক্টে অন্তর্ভুক্ত হতে পারে। এতে কিছু অপ্রয়োজনীয় কোড বা ক্লাসও আপনার প্রোজেক্টে প্রবেশ করতে পারে যা আপনার প্রোজেক্টের সাইজ বাড়ায় এবং পারফরম্যান্সে প্রভাব ফেলতে পারে।
Maven এর dependency management সিস্টেম আপনাকে সহজেই ট্রানজিটিভ ডিপেনডেন্সি পরিচালনা করার সুযোগ দেয়। এর ফলে, যখন আপনার প্রোজেক্টে কোনো লাইব্রেরির সংস্করণ পরিবর্তন করতে হয়, তখন Maven আপনাকে দ্রুত এবং সঠিকভাবে তা আপডেট করার সুযোগ দেয়। তবে আপনাকে dependency exclusion ব্যবহার করে নির্দিষ্ট ট্রানজিটিভ ডিপেনডেন্সি বাদ দিতে হতে পারে।
Dependency Mediation: Maven স্বয়ংক্রিয়ভাবে transitive dependency এর ভার্সন চয়েস করে থাকে, তবে আপনি dependencyManagement
ট্যাগ ব্যবহার করে এটি কাস্টমাইজ করতে পারেন।
উদাহরণ:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>library-b</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
</dependencyManagement>
Exclusion: আপনি যদি কোনো transitive dependency বাদ দিতে চান, তাহলে exclusion
ট্যাগ ব্যবহার করতে পারেন।
উদাহরণ:
<dependency>
<groupId>com.example</groupId>
<artifactId>library-a</artifactId>
<version>1.0</version>
<exclusions>
<exclusion>
<groupId>com.example</groupId>
<artifactId>library-b</artifactId>
</exclusion>
</exclusions>
</dependency>
এখানে library-b
কে library-a
থেকে বাদ দেয়া হয়েছে, যাতে এটি আপনার প্রোজেক্টে অন্তর্ভুক্ত না হয়।
Transitive Dependency হল Maven এর একটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যা এক ডিপেনডেন্সির মাধ্যমে অন্য ডিপেনডেন্সি আপনার প্রোজেক্টে যুক্ত করে। এটি ডিপেনডেন্সি ম্যানেজমেন্টকে অনেক সহজ করে, তবে এর কিছু নেতিবাচক প্রভাব যেমন ভার্সন কনফ্লিক্ট এবং অপ্রয়োজনীয় ডিপেনডেন্সি অন্তর্ভুক্ত হওয়ার ঝুঁকি থাকতে পারে। এসব সমস্যা মোকাবেলা করতে, Maven এ dependency mediation এবং exclusion এর মাধ্যমে আপনি নিরাপদে এবং কার্যকরীভাবে transitive dependency পরিচালনা করতে পারেন।
Maven একটি শক্তিশালী বিল্ড টুল যা Java প্রকল্পের জন্য ডিপেনডেন্সি ম্যানেজমেন্ট সহজ করে। Dependency Scope হল Maven এর একটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যা ডিপেনডেন্সির প্রাপ্যতা (availability) এবং ব্যবহারযোগ্যতার ক্ষেত্র (scope) নির্ধারণ করে। এটি নির্ধারণ করে যে একটি নির্দিষ্ট ডিপেনডেন্সি কোন ধাপে এবং কোন পরিবেশে (environment) ব্যবহার করা যাবে।
Maven-এ ডিপেনডেন্সি স্কোপের ব্যবহার ম্যানেজমেন্টের জন্য অত্যন্ত গুরুত্বপূর্ণ, কারণ এটি আপনার প্রজেক্টের ডিপেনডেন্সি সঠিকভাবে কনফিগার করতে সাহায্য করে এবং ডিপেনডেন্সি সম্পর্কিত সমস্যা (যেমন ভার্সন কনফ্লিক্ট) সমাধান করে।
Maven এ সাধারণত ছয়টি ধরনের ডিপেনডেন্সি স্কোপ রয়েছে:
এগুলির মধ্যে সবচেয়ে বেশি ব্যবহৃত স্কোপগুলি হল compile, provided, runtime, এবং test। নিচে এসবের বিস্তারিত ব্যাখ্যা এবং উদাহরণ দেওয়া হল।
compile স্কোপ হল Maven ডিপেনডেন্সির ডিফল্ট স্কোপ। যখন আপনি কোনো ডিপেনডেন্সি নির্দিষ্ট স্কোপ উল্লেখ না করেন, তখন Maven সেটিকে compile স্কোপ হিসেবে ধরবে। এটি কম্পাইল, টেস্ট এবং রানটাইম চলাকালীন সমস্ত অবস্থাতেই ব্যবহারযোগ্য থাকবে।
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.8</version>
</dependency>
এখানে, spring-core
ডিপেনডেন্সি ডিফল্টভাবে compile স্কোপে হবে এবং এটি প্রজেক্টের সমস্ত স্টেজে ব্যবহার করা যাবে।
provided স্কোপ ব্যবহার করার মাধ্যমে আপনি এমন ডিপেনডেন্সি যোগ করতে পারেন যা কম্পাইল এবং টেস্টের সময় প্রয়োজন, কিন্তু রানটাইমে এটি পরিবেশ থেকে সরবরাহ করা হবে। সাধারণত Servlet API বা JSP API এর মতো লাইব্রেরি গুলি provided স্কোপে ব্যবহৃত হয়, কারণ এগুলি সাধারণত ওয়েব সার্ভার (যেমন Tomcat) থেকে সরবরাহ করা হয়।
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
এখানে, servlet-api
ডিপেনডেন্সিটি provided স্কোপে রয়েছে, যার মানে এটি কম্পাইল এবং টেস্টের সময় ব্যবহৃত হবে, কিন্তু রানটাইমে সার্ভার থেকে পাওয়া যাবে।
runtime স্কোপের ডিপেনডেন্সি কেবলমাত্র রানটাইমে প্রয়োজন হয় এবং কম্পাইল টাইমে এটি প্রয়োজনীয় নয়। এই স্কোপের ডিপেনডেন্সিগুলি শুধুমাত্র যখন প্রকল্পটি রান হয় তখন ব্যবহৃত হয়।
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
<scope>runtime</scope>
</dependency>
এখানে, mysql-connector-java
ডিপেনডেন্সি runtime স্কোপে ব্যবহৃত হবে, যা কম্পাইল টাইমে প্রয়োজনীয় নয়, তবে প্রকল্প রান করার সময় এটি ডাটাবেসের সাথে সংযোগের জন্য ব্যবহার হবে।
test স্কোপ ব্যবহার করা হয় শুধুমাত্র টেস্ট কোডের জন্য, অর্থাৎ এটি শুধুমাত্র টেস্টের সময় ব্যবহার হবে। এই স্কোপে থাকা ডিপেনডেন্সিগুলি রানটাইম এবং কম্পাইল টাইমে ব্যবহৃত হবে না, শুধু টেস্টিংয়ের জন্যই ব্যবহৃত হবে। উদাহরণস্বরূপ, JUnit বা Mockito।
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
<scope>test</scope>
</dependency>
এখানে, junit
ডিপেনডেন্সিটি test স্কোপে রয়েছে এবং এটি শুধুমাত্র টেস্টিংয়ের জন্য ব্যবহৃত হবে।
system স্কোপ ব্যবহৃত হয় এমন ডিপেনডেন্সির জন্য যা আপনার সিস্টেমে ম্যানুয়ালি উপস্থিত। এই স্কোপের ডিপেনডেন্সিগুলি আপনার লোকাল ফাইল সিস্টেম বা নির্দিষ্ট লোকেশন থেকে সংগ্রহ করতে হবে।
<dependency>
<groupId>com.example</groupId>
<artifactId>some-library</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/some-library.jar</systemPath>
</dependency>
এখানে, some-library
একটি লোকাল জার ফাইল হিসেবে সিস্টেম পাথে উল্লেখ করা হয়েছে, যেটি system স্কোপে ব্যবহৃত হবে।
import স্কোপ সাধারণত Maven dependencyManagement সেকশনে ব্যবহৃত হয়। এটি প্যাকেজ বা বিল্ড সিস্টেমের মধ্যে ডিপেনডেন্সি রেজোলিউশনের জন্য ব্যবহৃত হয়।
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.4</version>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
এখানে, commons-collections4
এর ডিপেনডেন্সি import স্কোপে রাখা হয়েছে, যা শুধুমাত্র প্যাকেজ ডিপেনডেন্সির ক্ষেত্রে ব্যবহৃত হবে এবং প্রজেক্টে অন্তর্ভুক্ত হবে।
test
স্কোপে রাখা ডিপেনডেন্সি শুধুমাত্র টেস্ট রানের সময় ব্যবহৃত হয়, ফলে রানটাইমে অপ্রয়োজনীয় লাইব্রেরি লোড হওয়ার ঝামেলা থেকে মুক্তি পাওয়া যায়।provided
স্কোপ ব্যবহার করে আপনি এমন লাইব্রেরি সিলেক্ট করতে পারেন যা সার্ভার বা অন্যান্য পরিবেশ দ্বারা সরবরাহিত, যেমন সার্ভলেট API।Maven Dependency Scope হল একটি গুরুত্বপূর্ণ বৈশিষ্ট্য যা ডিপেনডেন্সি ব্যবস্থাপনা সহজ করে তোলে। এটি বিভিন্ন স্কোপে ডিপেনডেন্সি কনফিগার করে আপনার প্রজেক্টের ডিপেনডেন্সি সঠিকভাবে নিয়ন্ত্রণ করতে সাহায্য করে। compile, provided, runtime, test, system, এবং import এর মাধ্যমে আপনি আপনার প্রজেক্টের লাইব্রেরি ব্যবহারের কার্যকারিতা বাড়াতে পারেন।
Read more