[java] / usr / libexec / java_home에서 반환 된 Mac OS의 기본 Java VM을 어떻게 변경할 수 있습니까?

(이것이 SU에서 계속되어야하는지 확신 할 수 없었습니다. 마이그레이션은 확실히 옵션이지만 더 많은 프로그래머가 여기에서 질문을 읽고 여기에 있습니다).

Mac OS X 10.8.4를 실행 중이며 Apple의 JDK 1.6.0_51과 Oracle의 JDK 1.7.0_25가 설치되어 있습니다. 최근에 필요한 일부 시험판 소프트웨어에 대해 Oracle의 1.8 프리뷰 JDK를 설치했습니다. 이제 / usr / libexec / java_home을 실행하면 다음과 같이 표시됩니다.

$ /usr/libexec/java_home -V
Matching Java Virtual Machines (4):
    1.8.0, x86_64:  "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home
    1.7.0_25, x86_64:   "Java SE 7" /Library/Java/JavaVirtualMachines/jdk1.7.0_25.jdk/Contents/Home
    1.6.0_51-b11-457, x86_64:   "Java SE 6" /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
    1.6.0_51-b11-457, i386: "Java SE 6" /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home

큰.

그러나 다음을 실행합니다.

$ java -version

보고:

java version "1.8.0-ea"

즉, Java의 기본 버전은 현재 시험판 버전이므로 일부 “일반”패키지 (제 경우에는 VisualVM)가 중단됩니다.

JAVA_HOME응용 프로그램을 시작하면 명령 줄 (예 :)에서 시작할 때도 환경 변수가 무시되기 때문에 설정할 수 없습니다 $ open /Applications/VisualVM.app.

그렇다면 내 JVM 주문 기본 설정을 전역 적으로 설정할 수있는 편집 할 수있는 파일이 있습니까?

(단순히 작동하지 않기 때문에 Java 환경 설정 패널을 시작하라고 말하지 마십시오. 유용한 정보가 포함되어 있지 않으며 내가 설치 한 4 개의 JVM 중 하나만 나열됩니다.)

업데이트 :

Oracle JVM은 /Library/Java/JavaVirtualMachines. JDK 1.8 디렉토리의 이름을 바꾸어도 jdk1.8.0.jvm.xyz아무것도 변경되지 않습니다. java_home여전히 올바른 위치에 있으며 / usr / bin / java를 실행하면 여전히 1.8 JVM이 실행됩니다. 이것은 synlink 등의 문제가 아닙니다.

비슷한 질문에 대한 답변

이 답변 은 java_home에서 Java 버전을 제거하는 해킹의 양을 제공 하지만 java_home이 기본값을 선택 하는 방법 과 사용자가 비파괴 적으로 설정할 수 있는지 여부에 대한 질문에는 여전히 답변하지 않습니다 .



답변

JAVA_HOME당신이 할 수있는 최선 이라고 생각 합니다. 명령 줄 도구 는 해당 환경 변수를 좋아 java하고 javac존중하므로 명령 줄 도구가 Java 7을 사용하도록하기 위해 /usr/libexec/java_home -v '1.7*'입력 할 적절한 값을 제공하는 데 사용할 수 있습니다 JAVA_HOME.

export JAVA_HOME="`/usr/libexec/java_home -v '1.7*'`"

그러나 표준 더블 클릭 가능 애플리케이션 번들은 아래 /Library/Java에 설치된 JDK를 전혀 사용하지 않습니다 . .appApple을 사용하는 이전 스타일 번들 JavaApplicationStub은에서 Apple Java 6을 사용 하며 번들 JRE없이 AppBundler로/System/Library/Frameworks 빌드 된 새로운 스타일 의 번들 은 스터브 코드에 하드 코딩되어 변경할 수없는 “공개”JRE를 사용합니다. 두 개의 다른 공용 JRE를 동시에 설치할 수 없습니다./Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home


편집 : VisualVM을 구체적으로 살펴 봤습니다 . 다운로드 페이지 에서 “애플리케이션 번들”버전을 사용하고 있다고 가정 하고이 특정 앱은 AppBundler 애플리케이션이 아니라 기본 실행 파일이 번호를 호출하는 셸 스크립트입니다. 다른 쉘 스크립트와 다양한 구성 파일을 읽습니다. 기본적으로 /Library/Java7u10 이상인 경우 최신 JDK를 선택 하거나 Java 7 설치가 업데이트 9 이하인 경우 Java 6을 사용합니다. 그러나 쉘 스크립트에서 로직을 풀면 구성 파일을 사용하여 특정 JDK를 지정할 수있는 것처럼 보입니다.

줄을 포함하는 텍스트 파일을 만듭니다 ~/Library/Application Support/VisualVM/1.3.6/etc/visualvm.conf(1.3.6을 사용중인 VisualVM의 버전으로 대체).

visualvm_jdkhome="`/usr/libexec/java_home -v '1.7*'`"

그러면 8 대신 Java 7을 선택하게됩니다.


답변

나도 거기에 있었고 /usr/libexec/java_home작동 방식을 어디에서나 검색 했지만 나열되는 사용 가능한 Java 가상 머신을 결정하는 방법에 대한 정보를 찾을 수 없었습니다.

나는 약간의 실험을 해 보았고 단순히 a를 실행하고 거기에서 찾은 모든 런타임 ls /Library/Java/JavaVirtualMachines을 검사 한다고 생각합니다 ./<version>/Contents/Info.plist.

그런 다음 Info.plist에 포함 된 키를 기준으로 내림차순 으로 정렬하고 JVMVersion기본적으로 첫 번째 항목을 기본 JVM으로 사용합니다.

우리가 할 수있는 유일한 일은 plist를 변경하는 것입니다. sudo vi /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Info.plist그런 다음 JVMVersion을에서 1.8.0와 같이 상단이 아닌 하단으로 정렬하는 다른 것으로 수정합니다 !1.8.0.

다음과 같은 것 :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    ...
    <dict>
            ...
            <key>JVMVersion</key>
            <string>!1.8.0</string>   <!-- changed from '1.8.0' to '!1.8.0' -->`

그런 다음 목록 상단에서 마술처럼 사라집니다.

/usr/libexec/java_home -verbose
Matching Java Virtual Machines (3):
    1.7.0_45, x86_64:   "Java SE 7" /Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Home
    1.7.0_09, x86_64:   "Java SE 7" /Library/Java/JavaVirtualMachines/jdk1.7.0_09.jdk/Contents/Home
    !1.8.0, x86_64: "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home

이제 로그 아웃 / 로그인 후 다음을 수행해야합니다.

java -version
java version "1.7.0_45"

🙂

물론 지금은 다른 문제가 발생했는지 또는 1.8.0-ea 버전의 Java가 여전히 제대로 작동하는지 알 수 없습니다.

이 작업을 수행하지 말고 1.8.0을 제거하십시오.

그러나 지금까지 이것은 나를 위해 일했습니다.


답변

사실 꽤 쉽습니다. JavaVirtualMachines 폴더에 다음이 있다고 가정 해 보겠습니다.

  • jdk1.7.0_51.jdk
  • jdk1.8.0.jdk

1.8이 기본값이라고 가정하고 새 폴더 (예 : ‘old’)를 추가하고 기본 jdk 폴더를 새 폴더로 이동합니다. 수행 java -version, 등 짜잔 다시 1.7을!


답변

소매를 감아도 괜찮다면 매우 간단합니다 … / Library / Java / Home 은 JAVA_HOME의 기본값이며 다음 중 하나를 가리키는 링크 일뿐입니다.

  • /System/Library/Java/JavaVirtualMachines/1.?.?.jdk/Contents/Home
  • /Library/Java/JavaVirtualMachines/jdk1.?.?_??.jdk/Contents/Home

그래서 JAVA_HOME의 내용을 변경 하지 않고 기본 JVM / JDK 버전 변경하고 싶었습니다 … / Library / Java / Home은 현재 JVM / JDK의 표준 위치이며 그게 제가 보존하고 싶은 것입니다 … 최소한의 부작용으로 물건을 바꾸는 가장 쉬운 방법입니다.

사실 정말 간단합니다. java -version으로 표시되는 Java 버전을 변경하려면 다음 버전 만 있으면됩니다.

cd /Library/Java
sudo rm Home
sudo ln -s /Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home ./Home

나는 시간이 걸리지 않았지만 / usr / libexec / java_home 및 ln을 사용하여 위의 심볼릭 링크를 다시 가리키는 매우 간단한 쉘 스크립트는 어리석은 쉽게 만들 수 있습니다 …

/ Library / Java / Home이 가리키는 위치를 변경하면 … 올바른 결과를 얻습니다.

cerebro:~ magneto$ java -version
java version "1.8.0_60"
Java(TM) SE Runtime Environment (build 1.8.0_60-b27) Java HotSpot(TM)
64-Bit Server VM (build 25.60-b23, mixed mode)


답변

Java 7에 대한 Oracle의 제거 지침 이 저에게 효과적이었습니다.

발췌 :

JDK 제거 JDK를 제거하려면 관리자 권한이 있어야하며 루트로 또는 sudo (8) 도구를 사용하여 제거 명령을 실행해야합니다.

/ Library / Java / JavaVirtualMachines로 이동하여 이름이 다음 형식과 일치하는 디렉토리를 제거하십시오. *

/Library/Java/JavaVirtualMachines/jdk<major>.<minor>.<macro[_update]>.jdk

예를 들어 7u6을 제거하려면 다음을 수행하십시오.

% rm -rf jdk1.7.0_06.jdk


답변

조금 늦었지만 이것은 Mac OSX에서 진행중인 문제이므로 …

내가 찾은 가장 간단한 해결책은 Apple이 설치하는 OpenJDK 항목을 간단히 제거하는 것입니다. Mac OSX 업데이트가 도착할 때마다 설치되며 다시 제거해야합니다.

이것은 Java를 사용하여 Mac에서 Google App Engine 용 앱을 개발하는 경우 매우 잘 작동합니다. OpenJDK가 제대로 작동하지 않으며 Mac OSX Yosemite 업그레이드와 함께 제공되는 Java 버전으로 인해 모든 배포에서 App Engine 용 Eclipse 플러그인이 “읽기 시간 초과”라는 유용한 오류와 함께 비정상 종료됩니다.


답변

나는 “jenv”와 “JAVA_HOME”설정과 같은 다른 것들을 성공적으로 테스트하지 않았다. 이제 나는 다음 솔루션으로 끝납니다.

function setJava {
    export JAVA_HOME="$(/usr/libexec/java_home -v $1)"
    launchctl setenv JAVA_HOME $JAVA_HOME
    sudo ln -nsf "$(dirname ${JAVA_HOME})/MacOS" /Library/Java/MacOS
    java -version
}

(~ / .bashrc 또는 ~ / .bash.profile 또는 ~ / .zshrc에 추가됨)

그리고 그렇게 부르십시오.

setJava 1.8

java_home은 잘못된 입력을 처리합니다. 그래서 당신은 잘못을 할 수 없습니다. Maven 및 기타 항목은 이제 올바른 버전을 선택합니다.