Как получить расположение каскадов установки Java по умолчанию?

Я смотрю на то, как получить местоположение cacerts установки Java по умолчанию, когда у вас нет JAVA_HOME или же JRE_HOME определены.

Мне нужно решение, которое работает по крайней мере для OS X а также Linux,

Да. java -v предполагается работать:)

8 ответов

Под Linux, чтобы найти расположение $JAVA_HOME:

readlink -f /usr/bin/java | sed "s:bin/java::"

cacerts находятся под lib/security/cacerts:

$(readlink -f /usr/bin/java | sed "s:bin/java::")lib/security/cacerts

Под Mac OS X, чтобы найти $JAVA_HOME бежать:

/usr/libexec/java_home

cacerts находятся под Home/lib/security/cacerts:

$(/usr/libexec/java_home)/lib/security/cacerts

ОБНОВЛЕНИЕ (OS X с JDK)

вышеуказанный код был протестирован на компьютере без установленной JDK. С установленным JDK, как сказал pR0Ps, он находится на

$(/usr/libexec/java_home)/jre/lib/security/cacerts

Начиная с OS X 10.10.1 (Yosemite), расположение cacerts файл был изменен на

$(/usr/libexec/java_home)/jre/lib/security/cacerts

Если вам нужен программный доступ к этим сертификатам, лучше вообще не использовать файл, а получить к нему доступ через менеджер доверия. Следующий код взят из тестового примера OpenJDK (который гарантирует, что собранная коллекция cacerts не пуста):

TrustManagerFactory trustManagerFactory =
    TrustManagerFactory.getInstance("PKIX");
trustManagerFactory.init((KeyStore) null);
TrustManager[] trustManagers =
    trustManagerFactory.getTrustManagers();
X509TrustManager trustManager =
    (X509TrustManager) trustManagers[0];
X509Certificate[] acceptedIssuers =
    trustManager.getAcceptedIssuers();

Таким образом, вам не нужно иметь дело с местоположением файла или паролем хранилища ключей.

За Java 9вперед, это в

${JAVA_HOME}/lib/security/cacerts

в отличие от обычного

${JAVA_HOME}/jre/lib/security/cacerts

В MacOS Mojave это расположение:

/Library/Java/JavaVirtualMachines/jdk1.8.0_192.jdk/Contents/Home/jre/lib/security/cacerts 

Если для управления версиями Java используется sdkman, cacerts находится в

~/.sdkman/candidates/java/current/jre/lib/security

В Высоких Сьеррах каскасы расположены по адресу: /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/security/cacerts

В Ubuntu 20.04.3 LTS cacerts находится по адресу: /etc/ssl/certs/java/cacerts

      $ java --version
openjdk 11.0.11 2021-04-20
OpenJDK Runtime Environment (build 11.0.11+9-Ubuntu-0ubuntu2.20.04)
OpenJDK 64-Bit Server VM (build 11.0.11+9-Ubuntu-0ubuntu2.20.04, mixed mode, sharing)
      $ ls -lah /usr/lib/jvm/java-11-openjdk-amd64/lib/security/cacerts*
/usr/lib/jvm/java-11-openjdk-amd64/lib/security/cacerts -> /etc/ssl/certs/java/cacerts

Вы также можете обратиться к readlink -f "which javaMsgstr "Однако это может не сработать для всех бинарных оболочек. Скорее всего, лучше запустить класс Java.

Другие вопросы по тегам