Що таке класний шлях і як його встановити?


324

Я тільки читав цей рядок:

Перше, що робить метод format (), це завантажити шаблон швидкості з classpath з назвою output.vm

Будь-ласка, поясніть, що мав на увазі класний шлях у цьому контексті та як я повинен встановити класний шлях.

Відповіді:


530

Під час програмування на Java ви надаєте інші класи доступним для класу, який ви пишете, розміщуючи щось подібне у верхній частині вихідного файлу:

import org.javaguy.coolframework.MyClass;

Або іноді ви "масово імпортуєте" речі, кажучи:

import org.javaguy.coolframework.*;

Тож пізніше у своїй програмі, коли ви кажете:

MyClass mine = new MyClass();

Віртуальна машина Java буде знати, де знайти ваш компільований клас.

Недоцільно було б, щоб VM переглядав кожну папку на вашій машині, тому вам потрібно надати VM список місць, які слід шукати. Це робиться, розміщуючи папки та файли jar на вашому класі.

Перш ніж ми поговоримо про те, як встановлено класний шлях, поговоримо про .class файли, пакети та .jar файли.

По-перше, припустимо, що MyClass - це те, що ви створили у рамках свого проекту, і воно знаходиться в каталозі у вашому проекті під назвою output. Файл .class буде в output/org/javaguy/coolframework/MyClass.class(разом з усіма іншими файлами в цьому пакеті). Для того, щоб дістатися до цього файлу, ваш шлях просто повинен містити папку 'output', а не всю структуру пакету, оскільки ваш вивіз про імпорт надає всю цю інформацію до VM.

Тепер давайте припустимо, що ви зв’язуєте CoolFramework у файл .jar і помістите цей CoolFramework.jar у каталог lib у вашому проекті. Тепер вам потрібно було б поставити lib/CoolFramework.jarна свій класний шлях. ВМ загляне всередину файлу jar для org/javaguy/coolframeworkчастини та знайде свій клас.

Отже, класи класи містять:

  • Файли JAR та
  • Шлях до вершини ієрархій пакетів.

Як встановити свій класний шлях?

Перший спосіб, як здається, всі навчаються - це змінні середовища. На машині Unix ви можете сказати щось на кшталт:

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

На машині Windows потрібно перейти до налаштувань середовища та додати або змінити значення, яке вже є.

Другий спосіб - використовувати -cpпараметр при запуску Java, наприклад:

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

Варіант цього - третій спосіб, який часто виконується з файлом .shабо .batфайлом, який обчислює класний шлях і передає його Java через -cpпараметр.

Існує "готча" з усім вищезазначеним. У більшості систем (Linux, Mac OS, UNIX та ін.) Символ двокрапки (':') є роздільником класного шляху. У windowsm роздільником є ​​крапка з комою (';')

То який найкращий спосіб це зробити?

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

-Cp - це шлях. Я, як правило, переконуюсь, що мінлива середовища CLASSPATH - це порожня рядок, де я розвиваюсь, коли це можливо, щоб уникнути глобальних проблем з класовими шляхами (хоча деякі інструменти не раді, коли глобальний класний шлях порожній - я знаю про дві загальні мега-тисячі доларові ліцензовані сервери J2EE та Java, які мають такі проблеми з інструментами командного рядка).


12
Ще один добре пояснений блог про те, що таке PATH та CLASSPATH на Java - Path vs ClassPath
KNU

У python є папка під назвою Lib, де ви можете зберігати будь-який модуль, який можна використовувати в будь-який час, за допомогою простого заяви про імпорт. Чи відрізняється це від встановлення змінної середовища CLASSPATH до каталогу для сторонніх пакетів Java? Хоча це було б глобальним, не потрібно було б змінювати змінну, крім додавання більше пакетів.
Джозі Томпсон,

Приємна відповідь, але для манекенів тут: Чому вам не потрібно використовувати команду -cp для кожного нового класу, який ви створюєте? Це, безумовно, вирішується автоматично вашою системою? Але як? Іноді я стикаюся з проблемою, коли "щось" неможливо знайти на моєму класі - я думаю, що це так, тому що я не додав його до CP, але чому така помилка трапляється лише іноді замість завжди? Я запитую це, тому що, якщо чесно, я ніколи нічого не включав вручну з командою -cp і не знав би, що робити з подібною помилкою
Вік Торріоз,

2
@Vic Classpath повинен містити каталог над ієрархією каталогів, що відповідає імені пакета. Отже, якщо я маю org.javaguy.coolfwвідповідну структуру каталогів /path/to/org/javaguy/coolfw/, класpath повинен містити /path/to/. Якщо я додати новий пакет org.javaguy.hotfwу той же проект, результат класу (як правило) закінчується о /path/to/org/javaguy/hotfw/. Для цього потрібно містити класний шлях /path/to/, який він вже робить. Отже, новий пакет (і класи, що містяться в ньому) не потребують нових доповнень до classpath.
тіле

@Vic Більш конкретний приклад та пояснення дивіться у розділі Освоєння Java CLASSPATH (за відмінним коментарем KNU )
tjalling

67

Подумайте про це як відповідь Java на змінну середовища PATH - ОС шукають EXE на PATH, Java шукає класи та пакети на classpath.


13

Шлях до курсу - це шлях, по якому Java Virtual Machine шукає визначені користувачем класи, пакети та ресурси в програмах Java.

У цьому контексті format()метод завантажує файл шаблону з цього шляху.


5

Класовий шлях у цьому контексті - саме такий, який він є в загальному контексті: де завгодно VM знає, що він може знайти класи для завантаження, а також ресурси (наприклад, output.vm у вашому випадку).

Я б зрозумів, що Velocity очікує знайти файл з назвою output.vm в будь-якому місці "без пакета". Це може бути JAR, звичайна папка, ... Корінь будь-якого з розташувань у класі програми програми.


2

Налаштування змінної системи CLASSPATH

Для відображення поточної змінної CLASSPATH використовуйте ці команди в Windows та UNIX (оболонка Bourne): У Windows: C:\> set CLASSPATH У UNIX: % echo $CLASSPATH

Щоб видалити поточний вміст змінної CLASSPATH, використовуйте ці команди: У Windows: C:\> set CLASSPATH= В UNIX: % unset CLASSPATH; export CLASSPATH

Щоб встановити змінну CLASSPATH, використовуйте ці команди (наприклад): У Windows: C:\> set CLASSPATH=C:\users\george\java\classes У UNIX: % CLASSPATH=/home/george/java/classes; export CLASSPATH


1
Хоча ці команди можуть бути корисні для роботи зі змінними середовища, але це не відповідає на питання
Халк,

1

Classpath - це змінна середовище системи. Налаштування цієї змінної використовується для надання кореня будь-якої ієрархії пакетів компілятору Java.


1

CLASSPATH - це змінна середовище (тобто глобальні змінні операційної системи, доступні для всіх процесів), необхідні для компілятора Java та часу виконання для пошуку пакетів Java, які використовуються в програмі Java. (Чому б не зателефонувати PACKAGEPATH?) Це схоже на іншу змінну середовища PATH, яка використовується оболонкою CMD для пошуку виконуваних програм.

CLASSPATH можна встановити одним із наступних способів:

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

Статичний член класу можна викликати безпосередньо, не створюючи примірник об'єкта. Оскільки основним методом є статична Java, віртуальна машина може викликати його, не створюючи жодного примірника класу, який містить основний метод, який є початковою точкою програми.


0

Для користувачів Linux та підводячи підсумки та додавання до того, що тут сказали інші, слід знати наступне:

  1. $ CLASSPATH - це те, що Java використовує для перегляду декількох каталогів, щоб знайти всі різні класи, необхідні для вашого сценарію (якщо ви прямо не скажете про це іншим чином при перевірці -cp). Використання -cp вимагає, щоб ви відстежували всі каталоги вручну та копіювали та вставляли цей рядок щоразу, коли запускаєте програму (не бажано IMO).

  2. Символ двокрапки (":") розділяє різні каталоги. Є лише один $ CLASSPATH, і в ньому є всі каталоги. Отже, коли ви запускаєте "експортувати CLASSPATH = ....", ви хочете включити поточне значення "$ CLASSPATH", щоб додати його. Наприклад:

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

    У першому рядку вище, ви запускаєте CLASSPATH з простої «крапки», яка є шлях до вашої поточної робочої директорії. З цим, щоразу, коли ви запускаєте java, він буде переглядатись у поточному робочому каталозі (тому, у якому ви знаходитесь) для класів. У другому рядку вище $ CLASSPATH захоплює значення, яке ви раніше ввели (.), І додає шлях до dirver mysql. Тепер java шукатиме водія ТА для ваших занять.

  3. echo $CLASSPATH

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

  4. Tomcat не використовує CLASSPATH. Прочитайте, що з цим робити тут: https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.