неділя, 15 березня 2015 р.

Java: Path та Classpath

     Path та Classpath - важливі поняття, без розуміння яких іноді можна отримати купу проблем незрозумілого походження.

     Після установки пакету Java для програмування на ваш комп'ютер, директорія JDKбуде мати наступний вигляд:


     Директорія bin містить всі виконавчі файли JDK (Java Development Kit): компілятор, пусковик, javadoc, та інші.

     PATH - змінна середовища в операційних системах Unix, DOS, OS/2, та Microsoft Windows. Вона містить шляхи до виконавчих файлів всіх програм, які виконуються із командної стрічки на комп'ютері. Налаштовувати змінну для роботи із Джавою необов'язково, але в такому разі вам потрібно буде кожного разу вказувати повний шлях до місцезнаходження компілятора javac.exe та пусковика java.exe. Наприклад:

C:\Java\jdk1.7.0\bin\javac MyClass.java


     Погодьтесь, це не дуже зручно. Тому, щоб полегшити собі життя, ми додаємо шлях до директорії  bin  до поточного значення системної змінної PATH.  В Microsoft Windows значення змінною PATH розділені крапкою з комою (;):

 C:\Documents and Settings\All Users\Application Data\Oracle\Java\javapath;C:\oraclexe\app\oracle\product\11.2.0\server\bin;;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\Program Files\Alky for Applications\Libraries\;C:\MinGW\msys\1.0\bin\;C:\MinGW\bin\;C:\Program Files\Java\jdk1.7.0_21\bin;C:\Program Files\Android\android-sdk\platform-tools;

     Потрібно зазначити, що ви можете мати декілька версій JDK, встановлених на вашому ПК. Проте одночасно системна змінна повинна містити тільки один із шляхів, яким ви користуєтесь в даний момент. Тому що Віндовс виконує пошук файлу по черзі зліва направо, як тільки файл знаходиться, він виконується і пошук припиняється. Якщо наступного разу ви будете працювати з іншою версією Джави, просто замініть шлях до цієї іншої папки bin. Наприклад, 7-му версію компілятора замінити на 5-ту:

C:\Program Files\Java\jdk1.7.0_21\bin

поміняти на:

C:\Program Files\Java\jdk1.5\bin

     Для Windows XP додати значення до змінної PATH можна наступним чином:



     (Діалог  Властивості системи також можна викликати комбінацією кнопок Windows + Pause )



     Не забудьте розмежувати сусідні шляхи крапкою з комою. 

     Тепер черга CLASSPATH.  На відміну від PATH, ця змінна використовується тільки самою Джавою (JDK), а не всією системою (хоча гіпотетично може). Можливо навіть, що вам прийдеться самим її створити. В мене, наприклад, її не було.

     CLASSPATH дозволяє дізнатись, де потрібно шукати класи (байткоди), створені користувачами. Класи стандартного Джава-пакету шукаються з допомогою інших механізмів. Класи можуть бути збережені в окремих *.class файлах,  jar- та zip-архівах. Класи користувачів бажано тримати окремо від дерева каталогів Java. Тоді при переінсталяції, чи поновленні Джави не потрібно буде заново інсталювати класи користувача.

     Щоб перевірити, чи ця змінна існує, в командній стрічці Віндовс наберіть:

echo  %CLASSPATH%

     Якщо змінна ще не визначена, або її взагалі не існує, то у Віндовс ви побачите:

  %CLASSPATH% 


     Значення CLASSPATH можна поміняти:

- назавжди (тоді воно збережеться після перезавантаження комп'ютера, або відновиться, якщо його значення тимчасово було змінене протягом сесії);

- тимчасово (до наступного перезавантаження, або до наступного виклику команд, які змінять поточне значення).

     Щоб змінити значення змінної CLASSPATH назавжди, потрібно спочатку створити її, якщо цього не було зроблено раніше, і присвоїти потрібні значення. Для цього у Windows XP викликаєте діалог Властивості системи, як у випадку, описаному вище для змінної  PATH, тільки замість кнопки Змінити, натискаєте кнопку Створити:


     По-замовчуванню, значення CLASSPATH рівне "поточній директорії", яка позначається через символ крапки (.). Якщо ви присвоюєте змінній інше значення, то воно перепише значення по-замовчуванню. Тож якщо ви хочете додати поточну директорію до CLASSPATH, вам потрібно додати крапку, як один із шляхів пошуку класів:

.;D:\myApps;C:\myCLasses\projects

     Після цього потрібно перезавантажити комп'ютер.

     Але в документації по Java радять змінювати значення CLASSPATH тимчасово, залежно від проекту. Таким чином, ви зможете компілювати ваші проекти незалежно один від одного. Тимчасово (максимум до наступного перезавантаження системи) змінити змінну CLASSPATH можна або засобами Windows, використовуючи команду set у командній стрічці, або під час виклику однієї з програм JDK-пакету, яка може використовувати ключ -classpath або його скорочений варіант -cp


set CLASSPATH=path1;path2
 
     Настпуні інтсрументи JDK-пакету можуть працювати з ключем -classpath, який замінить поточне значення  системної змінної CLASSPATH на час роботи інтсрументу:  java, jdb, javac, javah, jdeps.


java   -classpath   C:\projects\MyClasses    utility.myapp.Cool

     Червоним вказано значення CLASSPATH, синім - ім'я класу, включаючи ім'я його пакету.

     Як і у випадку з set, ви можете вказати декілька шляхів для пошуку одночасно, розмежованих крапкою з комою:


java -classpath C:\projects\MyClasses;C:\projects\OtherClasses utility.myapp.Cool
 

     Порядок, у якому вказані шляхи пошуку є важливим. Інтерпретатор Джава починає шукати класи зліва направо і як тільки він знайде відповідний клас у першому шляху, далі пошук не продовжується, навіть якщо в інших шляхах існує клас із таким самим іменем.    

     Щоб видалити всі значення CLASSPATH для поточної сесії роботи командної стрічки, потрібно виконати:

set CLASSPATH=

     Значення шляху може містити символ зірочки (*), використання якої еквівалентне переліку всіх jar-пакетів у вказаній директорії. Зірочка не стосується .class та .zip файлів.

     Пошук відбувається тільки у вказаних директоріях, або jar-пакетах, але не у субдиректоріях.

     Остання директорія в значенні CLASSPATH повинна бути кореневою директорією для дерева каталогів визначеного ім'ям пакету програми. В цьому прикладі ієрархія папок є наступною:

java -classpath C:\projects\MyClasses utility.myapp.Cool

+ С
  + projects
    + MyClasses
      + utility
        + myapp
          + Cool.class 

     Якщо ж ми вказуємо шлях до архіву, то значення повинне містити повний шлях до архіву, включаючи його ім'я, або повний шлях і зірочку в кінці:

C:\projects\MyClasses\*
C:\projects\MyClasses\allclasses.jar 

     Якщо інструменти JDK не використовують ключі -sourcepath та\або -processorpath, то значення CLASSPATH буде також слугувати для пошуку не тільки класів, а і  вихідного коду класів та обробників анотацій.

      Помилки

     Із змінною CLASSPATH пов'язані дві найпоширеніші помилки: ClassNotFoundException та NoClassDefFoundError.

     Помилка ClassNotFoundException може виникнути під час виконання програми (runtime). Вона виникає тоді, коли JRE не може знайти класи, які ми намагаємося завантажити. Імена цих класів виступають стрічковими параметрами одного з методів:
  • forName() метод в класі Class.
  • findSystemClass( ) метод в класі ClassLoader .
  • loadClass( ) метод в класі ClassLoader.
     Наявність класів не перевіряється під час компілювання. Тому і виникає ця помилка тільки під час запуску програми.

     Помилка NoClassDefFoundError може виникнути під час виконання програми (runtime). Вона виникає тоді, коли класи були знайдені під час компілювання, але не можуть бути знайдені під час виконання. Наприклад, їх було переміщено до іншої директорії.


Джерела:

Немає коментарів:

Дописати коментар