Как добавить несколько файлов jar в classpath в linux
Хорошо, я очень новичок в Linux и командной строке и довольно новичок в java. Я получил стажировку, создав java-программу. Я, наконец, сделал это на своей машине (окнах), и теперь мне нужно перенести его на машину Linux, чтобы проверить, а затем запустить ее как исполняемый файл. Я много читал и изучал linux и понимал classpaths, но все еще очень сложно полностью понять. Он просто не нажимал на меня. Может ли кто-нибудь объяснить цель classpath упрощенным способом с помощью примеров? Один из самых запутанных аспектов для меня - это определение физического пути к банке. Я начинаю весь путь от usr или мне нужно только начинать с папки jvm? Если это имеет значение, моя java-программа не находится в папке jvm. Может ли кто-нибудь пролить свет на меня?
РЕДАКТИРОВАТЬ: спасибо вам, ребята, за вашу помощь, я не могу сказать, что я полностью уверен в этом, но мое понимание моей ситуации намного лучше.
Ответы
Ответ 1
Вы используете аргумент -classpath
. Вы можете использовать либо относительный, либо абсолютный путь. Это означает, что вы можете использовать путь относительно вашего текущего каталога, или вы можете использовать абсолютный путь, начинающийся с корня /
.
Пример:
bash$ java -classpath path/to/jar/file MyMainClass
В этом примере функция main
находится в MyMainClass
и будет включена где-то в файл jar.
Для компиляции вам нужно использовать javac
Пример:
bash$ javac -classpath path/to/jar/file MyMainClass.java
Вы также можете указать путь к классу через переменную окружения, следуйте этому примеру:
bash$ export CLASSPATH="path/to/jar/file:path/tojar/file2"
bash$ javac MyMainClass.java
Для любого нормально сложного Java-проекта вы должны искать ant script с именем build.xml
Ответ 2
Скажем, у вас есть несколько файлов jar a.jar, b.jar и c.jar. Чтобы добавить их в classpath во время компиляции, вам нужно сделать
$javac -cp .:a.jar:b.jar:c.jar HelloWorld.java
Для выполнения do
$java -cp .:a.jar:b.jar:c.jar HelloWorld
Ответ 3
Путь к классам - это место, где java-компилятор (команда: javac) и JVM (команда: java) выглядят, чтобы найти классы, к которым относится ваша ссылка на приложение.
Что означает, что приложение ссылается на другой класс? Простыми словами это означает использовать этот класс где-то в своем коде:
Пример:
public class MyClass{
private AnotherClass referenceToAnotherClass;
.....
}
Когда вы пытаетесь скомпилировать это (javac), компилятору понадобится класс AnotherClass. То же самое, когда вы пытаетесь запустить приложение: JVM будет нужен класс AnotherClass.
Чтобы найти этот класс, javac и JVM выглядят в определенном (множестве) месте (точках). Эти места задаются классом pathpath, который в 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 файлами/библиотеками. В этом случае вы должны убедиться, что банка, содержащая класс AnotherClass, находится на вашем classpaht:
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), расположенный в рабочем каталоге, а затем запустить скомпилированный класс (обратите внимание на "." в начале пути к классам, который обозначает текущий каталог). Этот каталог также должен быть добавлен в classpath. В противном случае 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 и добавьте эту строку где-нибудь в конце;
Однако путь к классу подвержен частым изменениям, поэтому вы можете захотеть, чтобы путь к классам был установлен в основной набор dirs, который вам часто требуется, а затем расширяет путь к классам каждый раз, когда вам нужно только для этого сеанса. Вот так:
export CLASSPATH=$CLASSPATH:"new directories according to your current needs"
Ответ 4
Шаг 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)