대신 환경 변수 설정을 사용할 수 있습니까 update-alternatives
?
그렇지 않다면 언제 어떤 방법을 사용해야 합니까? 감사해요.
내 질문은 독서에서 비롯됩니다.https://askubuntu.com/a/895024/1471
대부분의 답변은 나에게 너무 복잡합니다.
처음에 Oracle은 일부 환경 변수 설정을 기반으로 여러 버전의 Java를 설치할 수 있다고 판단했습니다.
간단하지만 이러한 변수를 모르는 사람들에게는 너무 복잡합니다. 누군가가 "update-java-alternatives"를 발명했습니다.
"update-java-alternatives"는 간단한 것으로 입증되었습니다. 일단 모든 것이 구성되면 프로그램을 실행하고 원하는 버전을 선택하기만 하면 됩니다.
문제는 이 솔루션을 직접 구성해야 하는 경우(Java의 모든 명령에 대해 구성해야 함) 구성하기가 너무 복잡하다는 것입니다.
가장 좋은 대답은기본으로 돌아가기.
.bash_profile
(사용자의 경우) 또는 (각 사용자의 경우)에서 다음 변수를 설정합니다/etc/profile
.JAVA_HOME=<The home of your new java distribution> PATH=<The bin directory of your new java distribution>:$PATH
내 경우에는 훨씬 더 쉬웠습니다... 이미
/etc/profile.d
다음 내용이 포함된 파일이 있습니다(새 디렉터리 구조로 업데이트했습니다).export J2SDKDIR=/usr/lib/jvm/jdk1.8.0_121 export J2REDIR=/usr/lib/jvm/jdk1.8.0_121/jre export PATH=/usr/lib/jvm/jdk1.8.0_121/bin:/usr/lib/jvm/jdk1.8.0_121/db/bin:/usr/lib/jvm/jdk1.8.0_121/jre/bin:$PATH export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_121 export DERBY_HOME=/usr/lib/jvm/jdk1.8.0_121/db
그게 다야! ! !
답변1
예, 일부 시스템은 정확히 그렇게 합니다.
FreeBSD/TrueOS 패키지 javavm
의 명령javavmwrapper
FreeBSD / TrueOS 에서 JRE에 제공되는 모든 명령은 /usr/local/bin/
다음 이름의 심볼릭 링크 입니다 ( appletviewer
, checkvms
, extcheck
, idlj
, jar
, jarsigner
, java
, java-rmi.cgi
, javac
, javadoc
, javah
, javap
, jcmd
, jconsole
, jdb
, jdeps
, jhat
, jinfo
, jjs
, jmap
, jps
, jrunscript
, , , , , , , , , , , , ,, , , , , , 그리고 .jsadebugd
jstack
jstat
jstatd
keytool
manvm
native2ascii
orbd
pack200
policytool
registervm
rmic
rmid
rmiregistry
schemagen
serialver
servertool
tnameserv
unpack200
unregistervm
wsgen
wsimport
xjc
/usr/local/bin/javavm
목록의 길이와 일반적으로 이러한 모든 명령이 동일한 JVM을 사용할 것으로 예상한다는 사실은 Debian/Ubuntu가 가지고 있는 것입니다 update-java-alternatives
. 조금 단순화하면 이러한 이름을 모두 알고 다음을 모두 update-java-alternatives
호출하는 하나의 프로그램이 있습니다. update-alternatives
그들을. (Debian/Ubuntu 시스템에서는 모든 명령을 한 번에 설정하는 update-alternatives
대신 단일 명령 설정을 사용하여 update-java-alternatives
여러 명령이 서로 다른 JRE를 호출하도록 할 수 있습니다 . 이는 javavmwrapper
FreeBSD/TrueOS 메커니즘에서는 불가능합니다.)
FreeBSD/TrueOS javavmwrapper
패키지 접근 방식은 가능한 모든 명령 이름을 포함하고 JRE 간에 변경이 있을 때 심볼릭 링크를 이동하는 대신 시스템의 파일 심볼릭 링크 결과가 아닌 런타임에 프로그래밍 방식으로 결정을 내리는 래퍼를 갖는 것입니다.
/usr/local/bin/javavm
바로 그 포장지입니다. 그것
- 호출되는 이름(0번째 인수의 기본 이름)을 결정합니다.
- 파일에서 적절한 JRE 루트 디렉토리 이름( 및 환경 변수
/usr/local/etc/javavms
에 설정된 사용자의 운영 체제, 공급업체 및 버전 설정과 일치 ) 을 검색합니다 .JAVA_OS
JAVA_VENDOR
JAVA_VERSION
JAVA_HOME
루트 디렉터리 이름의 값으로 설정합니다 .${JAVA_HOME}/bin/${basename}
이들 중 하나로 또는${JAVA_HOME}/jre/bin/${basename}
그 안에 있는 내용에 따라 자신을 덮어씁니다.
nosh 도구 세트가 포함된 서비스 번들
nosh 도구 세트를 사용하여 서비스 번들러를 생성할 때 시스템 관리자가 Debian/Ubuntu와 같은 시스템 또는 FreeBSD/TrueOS 등의 시스템을 사용하여 올바른 JRE를 선택하기 위한 run
"범용" 명령을 제공한다는 사실을 누구나 신뢰할 수 있습니다.java
alternatives
javavmwrapper
#!/빈/노쉬 #HBase를 기반으로 작성된 분산 및 확장 가능한 시계열 데이터베이스 기계 환경 환경 환경 하드 제한 -o 65536 소프트 제한 -o 하드 setuidgid——opentsdb sh -c "exec java ${JAVA_OPTS} -Xmx6000 -classpath \"${CLASSPATH}:${HBASE_CONF}\" -enableassertions -enablesystemassertions ${BIGTABLE_SUPPORT} -DLOG_FILE_PREFIX=/var/log/opentsdb/\"${MACHINEID }\"-net.opentsdb.tools.TSDMain"
...또는 도구 세트의 도구를 사용할 수도 있습니다 find-matching-jvm
.
#!/빈/노쉬 #HBase를 기반으로 작성된 분산 및 확장 가능한 시계열 데이터베이스 기계 환경 환경 환경 하드 제한 -o 65536 소프트 제한 -o 하드 일치하는 항목 찾기 jvm --version 1.6 --version 1.7 --version 1.8 setuidgid——opentsdb sh -c "exec \"${JAVA_HOME}/bin/java\" ${JAVA_OPTS} -Xmx6000 -classpath \"${CLASSPATH}:${HBASE_CONF}\" -enableassertions -enablesystemassertions ${BIGTABLE_SUPPORT} -DLOG_FILE_PREFIX=/ var/log/opentsdb/\"${MACHINEID}\"- net.opentsdb.tools.TSDMain"
find-matching-jvm
작업의 일부를 수행 javavm
하고 환경 변수가 아닌 명령줄 옵션으로 구동되는 JRE를 선택하며 더 많은 JVM 구성 정보가 어디서 나오는지도 알고 있습니다. 그것
- 적절한 JRE의 루트 디렉터리 이름(사용자가 선택한 운영 체제, 공급업체 및 명령줄 옵션에 의해 설정된 버전과 일치)을 찾고, 파일이
/usr/local/etc/javavms
있으면 검색하고,/usr/lib/jvm
없으면 디렉터리를 검색하고, 검색 경로를 하드와이어합니다. , 그렇지 않다면; JAVA_HOME
루트 디렉터리 이름의 값으로 설정합니다 .- 체인은 나머지 명령줄 인수로 지정된 다음 프로그램에 로드됩니다.
예제에서 다음 프로그램(실제로는 다음 프로그램, 하나만)은 를 사용하라는 쉘입니다 "${JAVA_HOME}/bin/java"
.
기본 지식
여기서의 이론적 근거는 파일 시스템과 일련의 기호 링크를 사용하여 /usr/bin/java
일반 명령에서 필요한 특정 JRE로 매핑하기로 한 결정을 인코딩하거나 구성 정보를 검색하여 프로그래밍 방식으로 필요한 JRE를 찾는 명령을 제공하는 것입니다. Debian/Ubuntu의 대체 시스템은 전자를 수행합니다. FreeBSD/TrueOS의 패키징 시스템은 후자를 구현합니다.
그러나 nosh 서비스 번들러 예제에서 볼 수 있듯이 여기에는 범위가 있습니다 run
.
환경 JAVA_HOME
변수는 중개자로 사용할 수 있는 규칙입니다. (Java VM과 언어 자체에는 이 환경 변수가 필요하지 않습니다.) JRE를 찾아 해당 루트 디렉터리를 JAVA_HOME
환경 변수에 넣고 항상 직접 호출하는 규칙을 사용할 수 있습니다.${JAVA_HOME}/bin/somecommand
이것은 확실히 환경을 설정하는 사람들이 .profile
채택한 규칙 입니다. Xe는 JAVA_HOME
xyr 옵션으로 설정되어 있으며 모든 것이 규칙에 따라 호출될 것으로 예상합니다. xe는 명령 검색 경로를 xyr 셸에 추가(동등)하여 수행합니다. ${JAVA_HOME}/bin/somecommand
${JAVA_HOME}/bin/
설명된 대로 FreeBSD/TrueOS javavm
래퍼와 nosh 도구 세트의 find-matching-jvm
도구 자체는 이 규칙을 사용하고 이 규칙이 이미 사용 중임을 알게 되면 이를 존중합니다. JAVA_HOME
환경 변수가 이미 설정되어 있는 것을 발견하면 직접 설정한 지점을 포함하여 모든 단계를 건너뜁니다.
Debian/Ubuntu 대안의 경우에는 그렇지 않습니다. 환경 변수를 인식하는 심볼릭 링크를 만드는 것은 다소 어렵고, 대체 시스템은 이미 내려진 결정( 시스템 관리자 update-alternatives
의 일부로 실행되는 동안 명시적으로 또는 간접적으로 update-java-alternatives
)을 심볼릭 링크에 인코딩합니다 /etc/alternatives/
.
그렇기 때문에 중요합니다반품Debian/Ubuntu 에서 PATH
include(동등)로 설정합니다. ${JAVA_HOME}/bin/
이것이 완료되지 않은 경우 java
find를 호출 /usr/bin/java
하면 미리 선택된 JRE에 대한 대체 시스템의 심볼릭 링크를 검색합니다. 쉘의 명령 검색 경로에 명시적으로 추가된 경우에만 ${JAVA_HOME}/bin/
직접 찾을 수 있습니다.
추가 읽기
javavm
. 사용자 매뉴얼. 무료 BSD. 2005.javavmwrapper
. FreeBSD 포트.- 조나단 데보인 폴라드(2017).
find-matching-jvm
. 스낵 가이드. 소프트웨어.
답변2
실행할 프로그램을 선택할 때 환경 변수와 환경 변수는 update-alternatives
상호 보완적입니다 . 전자를 사용하면 사용된 소프트웨어에 관계없이 누구나 설정 값을 정의할 수 있습니다. 후자를 사용하면 누구나 설정 값을 정의할 수 있습니다. 후자는 허용시스템 관리자자주 사용하는 명령에 대한 기본 공급자를 선택합니다.
예를 들어 관리자는 시스템 기본값을 선택할 수 있습니다.편집기 및 호출기별도의 구성 editor
및 pager
대안. 사용자는 EDITOR
(또는 VISUAL
) 및 환경 변수를 각각 설정하여 PAGER
선호하는 편집기와 호출기를 선택할 수 있습니다.
따라서 환경 변수는 대체되지 않으며 update-alternatives
다양한 사용 사례에 적합합니다. 그러나 선택한 설정으로 재정의될 수 있습니다 update-alternatives
.