Как добавить несколько файлов 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)