FreeBSD/TrueOS 패키지 javavm의 명령javavmwrapper

FreeBSD/TrueOS 패키지 javavm의 명령javavmwrapper

대신 환경 변수 설정을 사용할 수 있습니까 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, , , , , , , , , , , , ,, , , , , , 그리고 .jsadebugdjstackjstatjstatdkeytoolmanvmnative2asciiorbdpack200policytoolregistervmrmicrmidrmiregistryschemagenserialverservertooltnameservunpack200unregistervmwsgenwsimportxjc/usr/local/bin/javavm

목록의 길이와 일반적으로 이러한 모든 명령이 동일한 JVM을 사용할 것으로 예상한다는 사실은 Debian/Ubuntu가 가지고 있는 것입니다 update-java-alternatives. 조금 단순화하면 이러한 이름을 모두 알고 다음을 모두 update-java-alternatives호출하는 하나의 프로그램이 있습니다. update-alternatives그들을. (Debian/Ubuntu 시스템에서는 모든 명령을 한 번에 설정하는 update-alternatives대신 단일 명령 설정을 사용하여 update-java-alternatives여러 명령이 서로 다른 JRE를 호출하도록 할 수 있습니다 . 이는 javavmwrapperFreeBSD/TrueOS 메커니즘에서는 불가능합니다.)

FreeBSD/TrueOS javavmwrapper패키지 접근 방식은 가능한 모든 명령 이름을 포함하고 JRE 간에 변경이 있을 때 심볼릭 링크를 이동하는 대신 시스템의 파일 심볼릭 링크 결과가 아닌 런타임에 프로그래밍 방식으로 결정을 내리는 래퍼를 갖는 것입니다.

/usr/local/bin/javavm바로 그 포장지입니다. 그것

  1. 호출되는 이름(0번째 인수의 기본 이름)을 결정합니다.
  2. 파일에서 적절한 JRE 루트 디렉토리 이름( 및 환경 변수 /usr/local/etc/javavms에 설정된 사용자의 운영 체제, 공급업체 및 버전 설정과 일치 ) 을 검색합니다 .JAVA_OSJAVA_VENDORJAVA_VERSION
  3. JAVA_HOME루트 디렉터리 이름의 값으로 설정합니다 .
  4. ${JAVA_HOME}/bin/${basename}이들 중 하나로 또는 ${JAVA_HOME}/jre/bin/${basename}그 안에 있는 내용에 따라 자신을 덮어씁니다.

nosh 도구 세트가 포함된 서비스 번들

nosh 도구 세트를 사용하여 서비스 번들러를 생성할 때 시스템 관리자가 Debian/Ubuntu와 같은 시스템 또는 FreeBSD/TrueOS 등의 시스템을 사용하여 올바른 JRE를 선택하기 위한 run"범용" 명령을 제공한다는 사실을 누구나 신뢰할 수 있습니다.javaalternativesjavavmwrapper

#!/빈/노쉬
#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 구성 정보가 어디서 나오는지도 알고 있습니다. 그것

  1. 적절한 JRE의 루트 디렉터리 이름(사용자가 선택한 운영 체제, 공급업체 및 명령줄 옵션에 의해 설정된 버전과 일치)을 찾고, 파일이 /usr/local/etc/javavms있으면 검색하고, /usr/lib/jvm없으면 디렉터리를 검색하고, 검색 경로를 하드와이어합니다. , 그렇지 않다면;
  2. JAVA_HOME루트 디렉터리 이름의 값으로 설정합니다 .
  3. 체인은 나머지 명령줄 인수로 지정된 다음 프로그램에 로드됩니다.

예제에서 다음 프로그램(실제로는 다음 프로그램, 하나만)은 를 사용하라는 쉘입니다 "${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_HOMExyr 옵션으로 설정되어 있으며 모든 것이 규칙에 따라 호출될 것으로 예상합니다. 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 에서 PATHinclude(동등)로 설정합니다. ${JAVA_HOME}/bin/이것이 완료되지 않은 경우 javafind를 호출 /usr/bin/java하면 미리 선택된 JRE에 대한 대체 시스템의 심볼릭 링크를 검색합니다. 쉘의 명령 검색 경로에 명시적으로 추가된 경우에만 ${JAVA_HOME}/bin/직접 찾을 수 있습니다.

추가 읽기

답변2

실행할 프로그램을 선택할 때 환경 변수와 환경 변수는 update-alternatives상호 보완적입니다 . 전자를 사용하면 사용된 소프트웨어에 관계없이 누구나 설정 값을 정의할 수 있습니다. 후자를 사용하면 누구나 설정 값을 정의할 수 있습니다. 후자는 허용시스템 관리자자주 사용하는 명령에 대한 기본 공급자를 선택합니다.

예를 들어 관리자는 시스템 기본값을 선택할 수 있습니다.편집기 및 호출기별도의 구성 editorpager대안. 사용자는 EDITOR(또는 VISUAL) 및 환경 변수를 각각 설정하여 PAGER선호하는 편집기와 호출기를 선택할 수 있습니다.

따라서 환경 변수는 대체되지 않으며 update-alternatives다양한 사용 사례에 적합합니다. 그러나 선택한 설정으로 재정의될 수 있습니다 update-alternatives.

관련 정보