CentOS RPM: найти репо со старой версией библиотеки

Прежде всего, давайте проясним различия между двумя переменными окружения и их назначение:

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 не очень длинный и не содержит много больших архивов. Избегание глобального добавления также предотвращает конфликты версий, если многие архивы содержат различные версии одного и того же класса.

0
20.03.2018, 09:31
1 ответ

Благодаря @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

Это позволило мне установить более старые версии.

0
28.01.2020, 04:28

Теги

Похожие вопросы