Прежде всего, давайте проясним различия между двумя переменными окружения и их назначение:
PATH
используется только оболочкой для поиска исполняемых файлов, например java
или ls
или bash
. Поэтому вам не нужно трогать это, если только оболочка не жалуется на что-то вроде java: команда не найдена
.
CLASSPATH
- это то, что использует Java для поиска класса, который должен быть загружен. Однако он работает несколько иначе, чем PATH
: он должен содержать либо пути к отдельным файлам .class
, .zip
или .jar
, либо записи с подстановочным знаком.
Пути классов к файлам .jar, .zip или .class. Каждый путь класса должен заканчиваться именем файла или каталогом, в зависимости от того, к чему вы задаете путь класса:
Для файла .jar или .zip, содержащего файлы .class, путь класса заканчивается именем файла .zip или .jar.
Для файлов .class в безымянном пакете путь класса заканчивается каталогом, содержащим файлы .class.
Для файлов .class в именованном пакете путь класса заканчивается каталогом, содержащим "корневой" пакет (первый пакет в полном имени пакета). Записи пути класса могут содержать подстановочный символ basename , который считается эквивалентным указанию списка всех файлов в каталоге с расширением .jar или .JAR. Например, запись пути класса foo/ указывает все файлы JAR в каталоге с именем foo. Запись пути класса, состоящая просто из *, расширяется до списка всех файлов jar в текущем каталоге.
Запись пути классов, содержащая *, не будет соответствовать файлам классов. Чтобы найти классы и JAR-файлы в одном каталоге foo, используйте либо foo;foo/*, либо foo/*;foo. Выбранный порядок определяет, будут ли классы и ресурсы в foo загружены раньше JAR-файлов в foo, или наоборот.
В этом случае необходимо добавить путь к файлу AddOrReplaceReadGroups.jar
в CLASSPATH
и затем вызвать класс с полным именем пакета для запуска приложения. Вызываемый класс должен быть тем, который содержит метод main()
. В данном случае я понятия не имею, что это за класс, но после поиска в google можно предположить, что вызываемый класс - это net.sf.picard.sam.AddOrReplaceReadGroups
.
Но когда классы хранятся в архивном файле (.zip или .jar файл) запись пути класса - это путь до .zip или .jar включительно. файл. Например, чтобы использовать библиотеку классов, находящуюся в файле .jar, команда будет выглядеть примерно так:
C:> java -classpath C:\java\MyClasses\myclasses.jar utility.myapp.Cool
(выше приведены цитаты из Oracle JavaSE7 docs: Setting the class path, см. также Java tutorial on PATH and CLASSPATH для более полного объяснения их значений)
Итак, командная строка, которую следует использовать после добавления пути к AddOrReplaceReadGroups. jar
в CLASSPATH
должно быть:
> java net.sf.picard.sam.AddOrReplaceReadGroups
Если это все еще слишком громоздко, вы можете поместить это либо в псевдоним
оболочки, либо в сценарий.
Используя подход со сценарием, вы также можете напрямую поместить рабочую командную строку, о которой вы упоминали в вопросе, в сценарий, не трогая переменную окружения вообще. На самом деле, согласно документации Java, этот способ кажется предпочтительным, возможно, по крайней мере, частично, поскольку размещение большого количества вещей в глобально используемом CLASSPATH
увеличит накладные расходы на загрузку класса, поскольку все (не связанные) места, упомянутые в classpath, нужно будет посетить, чтобы найти класс, который нужно загрузить. Однако я не знаю, может ли это быть проблемой для настольных приложений, если только classpath не очень длинный и не содержит много больших архивов. Избегание глобального добавления также предотвращает конфликты версий, если многие архивы содержат различные версии одного и того же класса.
Благодаря @KnudLarsen, вот репозиторий, который я добавил в свой/etc/yum.repos.d
:
[centos-old.rep]
name=centos-old
baseurl=http://vault.centos.org/7.3.1611/os/x86_64/
enabled=1
gpgcheck=0
Это позволило мне установить более старые версии.