ক্লাসপথ কী এবং আমি কীভাবে সেট করব?


324

আমি কেবল এই লাইনটি পড়ছিলাম:

ফর্ম্যাট () পদ্ধতিটি প্রথম জিনিসটি হ'ল আউটপুট.ভিএম নামের শ্রেণিকপথ থেকে একটি বেগ টেম্পলেট লোড করা

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

উত্তর:


530

জাভাতে প্রোগ্রামিং করার সময়, আপনি আপনার উত্স ফাইলটির শীর্ষে এই জাতীয় কিছু রেখে আপনি যে ক্লাসটি লিখছেন তার জন্য অন্যান্য ক্লাসগুলি উপলভ্য করুন:

import org.javaguy.coolframework.MyClass;

বা কখনও কখনও আপনি এই বলে "বাল্ক আমদানি" স্টাফ করেন:

import org.javaguy.coolframework.*;

সুতরাং পরে আপনার প্রোগ্রামে যখন আপনি বলবেন:

MyClass mine = new MyClass();

জাভা ভার্চুয়াল মেশিনটি আপনার সংকলিত ক্লাসটি কোথায় পাবেন তা জানতে পারবেন will

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

ক্লাসপাথ কীভাবে সেট করা হয় সে সম্পর্কে কথা বলার আগে আসুন আমরা .class ফাইল, প্যাকেজ এবং .jar ফাইলগুলি সম্পর্কে কথা বলি।

প্রথমে ধরা যাক যে মাইক্লাস এমন একটি জিনিস যা আপনি আপনার প্রকল্পের অংশ হিসাবে তৈরি করেছেন এবং এটি আপনার প্রকল্পের ডিরেক্টরিতে বলা হয় output। .Class ফাইলটি output/org/javaguy/coolframework/MyClass.class(সেই প্যাকেজের প্রতিটি ফাইলের সাথে) থাকবে। এই ফাইলটিতে পৌঁছানোর জন্য, আপনার পাথের কেবল পুরো প্যাকেজ কাঠামো নয়, ফোল্ডারটির 'আউটপুট' থাকা দরকার কারণ আপনার আমদানি বিবৃতিটি ভিএমকে সমস্ত তথ্য সরবরাহ করে।

এখন ধরা যাক আপনি কুলফ্রেমকর্মকে একটি .jar ফাইলে বান্ডিল করেন এবং সেই কুলফ্রেমকর্ম.জারকে আপনার প্রকল্পের একটি লিবিব ডিরেক্টরিতে রেখে দিন। আপনার এখন lib/CoolFramework.jarআপনার ক্লাসপথে প্রবেশ করা দরকার । ভিএম org/javaguy/coolframeworkঅংশটির জন্য জার ফাইলটির ভিতরে সন্ধান করবে এবং আপনার ক্লাসটি সন্ধান করবে।

সুতরাং, শ্রেণিপথগুলিতে রয়েছে:

  • জেআর ফাইল, এবং
  • প্যাকেজ স্তরক্রমের শীর্ষে পাথ Path

আপনি কিভাবে আপনার ক্লাসপথ সেট করবেন?

সবাই যেভাবে প্রথম শিখতে পারে তা হল পরিবেশের ভেরিয়েবলগুলি with ইউনিক্স মেশিনে আপনি এমন কিছু বলতে পারেন:

export CLASSPATH=/home/myaccount/myproject/lib/CoolFramework.jar:/home/myaccount/myproject/output/

একটি উইন্ডোজ মেশিনে আপনাকে আপনার পরিবেশ সেটিংসে যেতে হবে এবং হয় ইতিমধ্যে উপস্থিত মানটি সংযোজন করতে হবে বা সংশোধন করতে হবে।

দ্বিতীয় -cpউপায়টি জাভা শুরু করার সময় প্যারামিটারটি ব্যবহার করা যেমন :

java -cp "/home/myaccount/myproject/lib/CoolFramework.jar:/home/myaccount/myproject/output/"  MyMainClass

এর একটি বৈকল্পিক তৃতীয় উপায় যা প্রায়শই একটি .shবা .batফাইল দিয়ে করা হয় যা ক্লাসপাথ গণনা করে এবং এটি -cpপ্যারামিটারের মাধ্যমে জাভাতে প্রেরণ করে ।

উপরের সমস্তটির সাথে একটি "গোটচা" রয়েছে। বেশিরভাগ সিস্টেমে (লিনাক্স, ম্যাক ওএস, ইউনিক্স, ইত্যাদি) কোলন চরিত্র (':') হয় শ্রেণিপথ বিভাজক। উইন্ডোজমে বিভাজকটি হল সেমিকোলন (';')

তাহলে এটি করার সর্বোত্তম উপায় কী?

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

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



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

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

2
@ উইক ক্লাসপথের প্যাকেজের নামের সাথে সম্পর্কিত ডিরেক্টরি শ্রেণিবিন্যাসের উপরে ডিরেক্টরি থাকতে হবে। সুতরাং যদি আমার org.javaguy.coolfwসাথে সম্পর্কিত ডিরেক্টরি কাঠামো থাকে /path/to/org/javaguy/coolfw/, ক্লাসপথটি ধারণ করা দরকার /path/to/। যদি আমি org.javaguy.hotfwএকই প্রকল্পে একটি নতুন প্যাকেজ যুক্ত করি , ফলাফল শ্রেণি (সাধারণত) এখানে শেষ হয় /path/to/org/javaguy/hotfw/। এর জন্য ক্লাসপাথটি থাকা দরকার /path/to/, যা এটি ইতিমধ্যে রয়েছে। সুতরাং নতুন প্যাকেজটি (এবং এতে থাকা ক্লাসগুলি) ক্লাসপথে নতুন সংযোজনের দরকার নেই।
tjalling

@ ভিক আরও দৃ concrete় উদাহরণ এবং ব্যাখ্যার জন্য, জাভা CLASSPATH ( KNU এর চমৎকার মন্তব্য অনুযায়ী ) আয়ত্ত করা দেখুন
২৪

67

এটি প্যাথ এনভায়রনমেন্ট ভেরিয়েবলের জাভার জবাব হিসাবে ভাবেন - ওএসরা PATH এ এক্সইএস অনুসন্ধান করে, জাভা ক্লাসপথে ক্লাস এবং প্যাকেজগুলির সন্ধান করে।


13

ক্লাসপথ হল সেই পথ যেখানে জাভা ভার্চুয়াল মেশিন জাভা প্রোগ্রামগুলিতে ব্যবহারকারী-সংজ্ঞায়িত শ্রেণি, প্যাকেজ এবং সংস্থানগুলির সন্ধান করে।

এই প্রসঙ্গে, format()পদ্ধতিটি এই পথ থেকে একটি টেম্পলেট ফাইল লোড করে।


5

এই প্রসঙ্গে ক্লাসপথটি সাধারণ প্রসঙ্গে যেমনটি হয় ঠিক তেমনই: ভিএম যে কোনও জায়গায় জানে যে এটি ক্লাসগুলি লোড করার জন্য এবং সংস্থানগুলিও খুঁজে পেতে পারে (যেমন আপনার ক্ষেত্রে আউটপুট.ভিএম)।

আমি বুঝতে পারি वेगটি "নো প্যাকেজ" তে কোথাও আউটপুট.ভিএম নামের একটি ফাইল খুঁজে পাওয়ার আশা করে। এটি একটি জার, নিয়মিত ফোল্ডার, ... অ্যাপ্লিকেশনটির ক্লাসপাথের যে কোনও অবস্থানের মূল হতে পারে।


2

CLASSPATH সিস্টেম পরিবর্তনশীল সেট করা হচ্ছে

বর্তমান CLASSPATH ভেরিয়েবলটি প্রদর্শনের জন্য, উইন্ডোজ এবং ইউনিক্স (বোর্ন শেল) এ এই কমান্ডগুলি ব্যবহার করুন: উইন্ডোজে: C:\> set CLASSPATH ইউনিক্সে: % echo $CLASSPATH

CLASSPATH ভেরিয়েবলের বর্তমান সামগ্রীগুলি মুছতে, এই আদেশগুলি ব্যবহার করুন: উইন্ডোজে: C:\> set CLASSPATH= ইউনিক্সে: % unset CLASSPATH; export CLASSPATH

CLASSPATH ভেরিয়েবল সেট করতে, এই কমান্ডগুলি ব্যবহার করুন (উদাহরণস্বরূপ): উইন্ডোজ: C:\> set CLASSPATH=C:\users\george\java\classes ইউনিক্সে: % CLASSPATH=/home/george/java/classes; export CLASSPATH


1
যদিও এই কমান্ডগুলি পরিবেশের ভেরিয়েবলগুলির সাথে কাজ করার জন্য দরকারী হতে পারে তবে এটি প্রশ্নের উত্তর দেয় না
হাল্ক

1

ক্লাসপাথ সিস্টেমের পরিবেশগত পরিবর্তনশীল। এই ভেরিয়েবলের সেটিংটি জাভা সংকলককে যে কোনও প্যাকেজ শ্রেণিবিন্যাসের মূল সরবরাহ করতে ব্যবহৃত হয়।


1

CLASSPATH একটি পরিবেশ পরিবর্তনশীল (যেমন সমস্ত প্রসেসের জন্য উপলব্ধ অপারেটিং সিস্টেমের গ্লোবাল ভেরিয়েবল) জাভা প্রোগ্রামারে ব্যবহৃত জাভা প্যাকেজগুলি সনাক্ত করার জন্য জাভা সংকলক এবং রানটাইমের জন্য প্রয়োজনীয়। (প্যাকেজপাথকে কেন ডাকবেন না?) এটি অন্য পরিবেশের পরিবর্তনশীল PATH এর মতো, যা এক্সিকিউটেবল প্রোগ্রামগুলি খুঁজতে সিএমডি শেল ব্যবহার করে by

ক্লাসস্পাট নিম্নলিখিত উপায়ে একটিতে সেট করা যেতে পারে:

CLASSPATH can be set permanently in the environment: In Windows, choose control panel  System  Advanced  Environment Variables  choose "System Variables" (for all the users) or "User Variables" (only the currently login user)  choose "Edit" (if CLASSPATH already exists) or "New"  Enter "CLASSPATH" as the variable name  Enter the required directories and JAR files (separated by semicolons) as the value (e.g., ".;c:\javaproject\classes;d:\tomcat\lib\servlet-api.jar"). Take note that you need to include the current working directory (denoted by '.') in the CLASSPATH.

To check the current setting of the CLASSPATH, issue the following command:

> SET CLASSPATH

CLASSPATH can be set temporarily for that particular CMD shell session by issuing the following command:

> SET CLASSPATH=.;c:\javaproject\classes;d:\tomcat\lib\servlet-api.jar

Instead of using the CLASSPATH environment variable, you can also use the command-line option -classpath or -cp of the javac and java commands, for example,

> java classpath c:\javaproject\classes com.abc.project1.subproject2.MyClass3

0

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


0

লিনাক্স ব্যবহারকারীদের জন্য, এবং অন্যরা এখানে যা বলেছেন তা যোগ করতে এবং যুক্ত করতে আপনার নিম্নলিখিত বিষয়গুলি জানতে হবে:

  1. Script CLASSPATH হ'ল যা আপনার স্ক্রিপ্টের জন্য প্রয়োজনীয় বিভিন্ন শ্রেণীর জন্য সন্ধানের জন্য একাধিক ডিরেক্টরি অনুসন্ধান করতে জাভা ব্যবহার করে (যদি না আপনি স্পষ্টভাবে এটি অন্যথায় -cp ওভাররাইড দিয়ে না বলে থাকেন)। -Cp ব্যবহারের জন্য আপনাকে সমস্ত ডিরেক্টরি ম্যানুয়ালি ট্র্যাক করে রাখা এবং প্রোগ্রামটি প্রতিবার চালানোর সময় সেই লাইনটি অনুলিপি-করা (পছন্দসই IMO নয়) প্রয়োজন।

  2. কোলন (":") অক্ষর বিভিন্ন ডিরেক্টরি পৃথক করে। এখানে কেবল একটি $ CLASSPATH রয়েছে এবং এর এতে সমস্ত ডিরেক্টরি রয়েছে। সুতরাং, যখন আপনি চালান "ক্লাসস্প্যাথ = রফতানি করুন" .... আপনি এতে যুক্ত হওয়ার জন্য আপনি বর্তমান মান "LA CLASSPATH" অন্তর্ভুক্ত করতে চান। উদাহরণ স্বরূপ:

    export CLASSPATH=.
    export CLASSPATH=$CLASSPATH:/usr/share/java/mysql-connector-java-5.1.12.jar

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

  3. echo $CLASSPATH

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

  4. টমক্যাট ক্লাসস্প্যাট ব্যবহার করে না। এখানে সেগুলি সম্পর্কে কী করবেন তা পড়ুন: https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html

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