it-roy-ru.com

Как добавить несколько файлов JAR в classpath в Linux

Хорошо, я очень плохо знаком с Linux и командной строкой, и довольно плохо знаком с Java. Я получил стажировку по созданию программы на Java. Я наконец сделал это на своей машине (Windows), и теперь мне нужно перенести его на Linux-машину для тестирования, а затем запустить как исполняемый файл. Я много читал и исследовал Linux и изучал пути к классам, но все еще очень трудно полностью понять. Это просто еще не для меня. Кто-нибудь может объяснить цель classpath в упрощенном виде на примерах? Один из самых запутанных аспектов для меня - это определение физического пути к банке. Я начинаю весь путь с usr или мне нужно начинать только с папки jvm? Если это имеет значение, моя Java-программа не находится в папке jvm. Кто-нибудь может пролить немного света на меня?

Правка: ребята большое спасибо за вашу помощь, я не могу сказать, что я полностью в курсе, но мое понимание моей ситуации намного лучше.

14
exit_1

Вы используете аргумент -classpath. Вы можете использовать относительный или абсолютный путь. Это означает, что вы можете использовать путь относительно вашего текущего каталога, OR вы можете использовать абсолютный путь, который начинается с корня /.

Пример:

bash$ Java -classpath path/to/jar/file MyMainClass

В этом примере функция main находится в MyMainClass и будет включена в файл jar.

Для компиляции нужно использовать javac

Пример:

bash$ javac -classpath path/to/jar/file MyMainClass.Java

Вы также можете указать classpath через переменную окружения, следуйте этот пример :

bash$ export CLASSPATH="path/to/jar/file:path/tojar/file2"
bash$ javac MyMainClass.Java

Для любого обычно сложного Java-проекта вы должны найти ant-скрипт с именем build.xml

12
Petriborg

Допустим, у вас есть несколько jar-файлов a.jar, b.jar и c.jar. Чтобы добавить их в classpath во время компиляции, вам нужно сделать

$javac -cp .:a.jar:b.jar:c.jar HelloWorld.Java

Бежать делать

$Java -cp .:a.jar:b.jar:c.jar HelloWorld
16
noPE

Путь к классам - это место, в котором компилятор Java (команда: javac) и JVM (команда: Java) ищут, чтобы найти классы, на которые ссылается ваше приложение. Что означает, что приложение ссылается на другой класс? Простыми словами это означает использовать этот класс где-то в его коде: 

Пример:

public class MyClass{
    private AnotherClass referenceToAnotherClass;
    .....
}

Когда вы попытаетесь скомпилировать это (javac), компилятору понадобится класс AnotherClass. То же самое, когда вы пытаетесь запустить ваше приложение: JVM понадобится класс AnotherClass . Чтобы найти этот класс, javac и JVM смотрят в определенном (множестве) месте (ах). Эти места указываются в classpath, который в linux представляет собой список каталогов, разделенных двоеточиями (каталоги, в которых должен искать javac/JVM, чтобы найти AnotherClass, когда им это нужно). 

Поэтому, чтобы скомпилировать свой класс и затем запустить его, вы должны убедиться, что classpath содержит каталог, содержащий класс AnotherClass. Затем вы вызываете это так: 

javac -classpath "dir1;dir2;path/to/AnotherClass;...;dirN" MyClass.Java //to compile it
Java -classpath "dir1;dir2;path/to/AnotherClass;...;dirN" MyClass //to run it

Обычно классы представлены в виде «комплектов», называемых jar-файлами/библиотеками. В этом случае вы должны убедиться, что jar, содержащий класс AnotherClass, находится в вашем классе:

javac -classpath "dir1;dir2;path/to/jar/containing/AnotherClass;...;dirN" MyClass.Java //to compile it
Java -classpath ".;dir1;dir2;path/to/jar/containing/AnotherClass;...;dirN" MyClass //to run it

В приведенных выше примерах вы можете увидеть, как скомпилировать класс (MyClass.Java), расположенный в рабочем каталоге, а затем запустить скомпилированный класс (обратите внимание на «.» В начале пути к классам, который обозначает текущий каталог). Этот каталог также должен быть добавлен в путь к классам. В противном случае JVM не сможет найти его.

Если у вас есть ваш класс в файле jar, как вы указали в вопросе, то вы должны убедиться, что jar также находится в пути к классам вместе с остальными необходимыми каталогами. 

Пример: 

Java -classpath ".;dir1;dir2;path/to/jar/containing/AnotherClass;path/to/MyClass/jar...;dirN" MyClass //to run it

или более общий (предполагая некоторую иерархию пакетов):

Java -classpath ".;dir1;dir2;path/to/jar/containing/AnotherClass;path/to/MyClass/jar...;dirN" package.subpackage.MyClass //to run it

Чтобы избежать установки пути к классам каждый раз, когда вы хотите запустить приложение, вы можете определить переменную среды с именем CLASSPATH. 

В Linux, в командной строке: 

export CLASSPATH="dir1;dir2;path/to/jar/containing/AnotherClass;...;dirN" 

или отредактируйте ~/.bashrc и добавьте эту строку где-нибудь в конце;

Однако путь к классу подвержен частым изменениям, поэтому вам может потребоваться установить для classpath базовый набор каталогов, который вам нужен часто, а затем расширять classpath каждый раз, когда вам нужно только для этого сеанса. Как это: 

export CLASSPATH=$CLASSPATH:"new directories according to your current needs" 
5
Razvan

Шаг 1.

vi ~/.bashrc

Шаг 2. Добавьте эту строку в последний:

export CLASSPATH=$CLASSPATH:/home/abc/lib/*;  (Assuming the jars are stored in /home/abc/lib) 

Шаг 3. 

source ~/.bashrc

После этих шагов направьте компиляцию и запустите ваши программы (например, javac xyz.Java)

0
user9218212