Đích chính xác cho biến môi trường JAVA_HOME cho bản phân phối dựa trên Linux OpenJDK Debian là gì?


90

Trong Windows, JAVA_HOMEphải trỏ đến thư mục cài đặt JDK (để JAVA_HOME/binchứa tất cả các tệp thực thi và JAVA_HOME/libschứa tất cả các jarthư viện mặc định ).

Nếu tôi tải xuống gói JDK của Sun và cài đặt nó trong Linux, thì quy trình tương tự.

Tuy nhiên, tôi cần sử dụng gói OpenJDK mặc định của Kubuntu. Vấn đề là tất cả các tệp thực thi được đặt trong /usr/bin. Nhưng các lọ được đặt trong /usr/share/java. Vì chúng không nằm trong cùng một JAVA_HOMEthư mục nên tôi đang gặp sự cố với Grails và có thể sẽ gặp sự cố với các ứng dụng khác mong đợi cấu trúc Java tiêu chuẩn.

  1. Nếu tôi sử dụng:

    JAVA_HOME=/usr
    

    Tất cả các ứng dụng và tập lệnh muốn sử dụng bất kỳ tệp thực thi Java nào đều có thể sử dụng quy trình chuẩn call $JAVA_HOME/bin/executable. Tuy nhiên, kể từ khi lọ đang ở một nơi khác nhau, họ không phải lúc nào được tìm thấy (ví dụ: trong grails tôi nhận được ClassDefNotFoundcho native2ascii).

  2. Mặt khác, nếu tôi sử dụng:

    JAVA_HOME=/usr/share/java
    

    Không ai trong số các tập tin thực thi Java ( java, javac, vv) có thể được tìm thấy.

Vậy, cách chính xác để xử lý JAVA_HOMEbiến trong Linux dựa trên Debian là gì?

Cảm ơn sự giúp đỡ của bạn, Luis

Câu trả lời:


97

Những gì cuối cùng đã làm việc cho tôi (Grails hiện hoạt động trơn tru) đang hoạt động gần giống như Steve B. đã chỉ ra:

JAVA_HOME=/usr/lib/jvm/default-java

Bằng cách này nếu người dùng thay đổi JDK mặc định cho hệ thống, nó JAVA_HOMEvẫn hoạt động.

default-java là một liên kết tượng trưng với JVM hiện tại.


6
Có vẻ như không có liên kết như vậy trên Debian 7
a1an

3
Trên RHEL5.10, đó là / usr / lib / jvm / java
Brian

1
Tôi đã sử dụng / usr / lib / jvm / java-7-openjdk-amd64
Randall Bohn

Đối với Oracle Linux 7 (điều này sẽ áp dụng cho CentOS và RHEL), tôi đã tạo một tệp có tên /etc/profile.d/java.sh và điền vào nó như sau: JAVA_HOME = / usr / lib / jvm / jre-openjdk export JAVA_HOME sau khi tìm lại nguồn / etc / profile (bằng cách chạy source / etc / profile) JAVA_HOME đã được điền như mong đợi.
darnold0714

79

Nếu bạn sử dụng các lựa chọn thay thế để quản lý nhiều phiên bản java, bạn có thể đặt JAVA_HOMEdựa trên java được liên kết tượng trưng (hoặc javac) như sau:

export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::")

3
Công trình này cho tôi: JAVA_HOME = $ (readlink -f / usr / bin / java | sed "s: / jre / bin / java ::")
dpnsan

4
Giải pháp tuyệt vời, giải quyết cơn đau đầu kéo dài nhiều năm của tôi với JAVA_HOME, vốn có xu hướng trỏ đến những vị trí khác nhau trên các hệ điều hành khác nhau.
Datageek

3
lưu ý rằng giải pháp thông minh này sẽ không hoạt động trên các bản phân phối như Gentoo có /usr/bin/javatrỏ đến một script ( /usr/libexec/eselect-java/run-java-tool.bash). tuy nhiên, đó là một cách tiếp cận tốt. điều duy nhất tôi muốn thay đổi là sử dụng thay thế nội trang của Bash để tránh sinh sản sed, ví dụ:JAVA_HOME=$( j=$( readlink -f /usr/bin/java ) ; echo ${j%%/bin/java} )
RubyTuesdayDONO

Điều này hoạt động tốt :) Có thể muốn thay đổi javacthành javavì không phải ai cũng đã cài đặt JDK; chỉ JRE
Hanxue

1
@AlexisWilke bây giờ java thay vì javac
bbaassssiiee

6

Cài đặt Ubuntu tiêu chuẩn dường như đưa các phiên bản Java khác nhau vào /usr/lib/jvm. Các javac, java bạn tìm thấy trong đường dẫn của bạn sẽ softlink này.

Không có vấn đề gì với việc cài đặt phiên bản Java của riêng bạn ở bất kỳ đâu bạn thích, miễn là bạn đặt JAVA_HOMEbiến môi trường và đảm bảo có Java mới bintrên đường dẫn của bạn.

Một cách đơn giản để thực hiện điều này là để trang chủ Java tồn tại dưới dạng một liên kết mềm, để nếu bạn muốn nâng cấp hoặc chuyển đổi phiên bản, bạn chỉ phải thay đổi thư mục trỏ đến - ví dụ:

/usr/bin/java --> /opt/jdk/bin/java,

/opt/jdk --> /opt/jdk1.6.011

rất nguy hiểm khi đề xuất các giải pháp Ubuntu với Debian. Họ có thể và làm khác nhau.
RichieHH

4
Lưu ý rằng người yêu cầu cho biết anh ta đã sử dụng Kubuntu, vì vậy các giải pháp Ubuntu sẽ ổn.
Joseph Holsten

0

Tôi thường không có bất kỳ biến môi trường JAVA_HOME nào. Java có thể tự thiết lập nó. Thuộc tính hệ thống bên trong java java.home nên có sẵn.


Tôi thường không có nó. Tuy nhiên, nếu tôi không thiết lập nó, grails phàn nàn rằng JAVA_HOME không có ở đó và hủy bỏ.
Luis Soeiro

nhu cầu kiến nó quá trong debian đó là bối cảnh
RichieHH


0

Theo như tôi nhớ, tôi đã sử dụng tập lệnh update-java-Alternatives thay vì update-Alternatives. Và nó đã đặt JAVA_HOME cho tôi một cách chính xác.


0

Nếu bạn gặp vấn đề với việc không tìm thấy tệp JAR, tôi cũng sẽ đảm bảo CLASSPATH của bạn được đặt để bao gồm vị trí của các tệp đó. Tuy nhiên, tôi thấy rằng CLASSPATH thường cần được đặt khác nhau cho các chương trình khác nhau và thường kết thúc là một thứ để đặt duy nhất cho các chương trình riêng lẻ.



0

Tôi đã phát hiện ra các vấn đề tương tự với các gói openjdk-6-jre và openjdk-6-jre-headless trong Ubuntu.

Vấn đề của tôi đã được giải quyết bằng cách xóa các gói openjdk-6-jre và openjdk-6-jre-headless và cài đặt lại. Các lựa chọn thay thế chỉ được cập nhật trên bản cài đặt mới của gói openjdk-6-jre và openjdk-6-jre-headless.

Dưới đây là mẫu cài đặt sau khi thanh lọc:

aptitude purge openjdk-6-jre openjdk-6-jre-headless # to ensure no configuration exists
aptitude install --without-recommends openjdk-6-jre # Installing without some extras
Reading package lists... Done
Building dependency tree
Reading state information... Done
Reading extended state information
Initializing package states... Done
The following NEW packages will be installed:
  ca-certificates-java{a} java-common{a} libavahi-client3{a} libavahi-common-data{a} libavahi-common3{a} libcups2{a} libflac8{a} libgif4{a} libnspr4-0d{a} libnss3-1d{a} libogg0{a} libpulse0{a} libsndfile1{a} libvorbis0a{a} libvorbisenc2{a} libxi6{a} libxtst6{a}
  openjdk-6-jre openjdk-6-jre-headless{a} openjdk-6-jre-lib{a} tzdata-java{a}
The following packages are RECOMMENDED but will NOT be installed:
  icedtea-6-jre-cacao icedtea-netx ttf-dejavu-extra
0 packages upgraded, 21 newly installed, 0 to remove and 119 not upgraded.
Need to get 0B/34.5MB of archives. After unpacking 97.6MB will be used.
Do you want to continue? [Y/n/?]
Writing extended state information... Done
Selecting previously deselected package openjdk-6-jre-lib.
(Reading database ... 62267 files and directories currently installed.)
Unpacking openjdk-6-jre-lib (from .../openjdk-6-jre-lib_6b24-1.11.5-0ubuntu1~10.04.2_all.deb) ...
...
Processing triggers for man-db ...
Setting up tzdata-java (2012e-0ubuntu0.10.04) ...
...
Setting up openjdk-6-jre-headless (6b24-1.11.5-0ubuntu1~10.04.2) ...
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/java to provide /usr/bin/java (java) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/keytool to provide /usr/bin/keytool (keytool) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/pack200 to provide /usr/bin/pack200 (pack200) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/rmid to provide /usr/bin/rmid (rmid) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/rmiregistry to provide /usr/bin/rmiregistry (rmiregistry) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/unpack200 to provide /usr/bin/unpack200 (unpack200) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/orbd to provide /usr/bin/orbd (orbd) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/servertool to provide /usr/bin/servertool (servertool) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/tnameserv to provide /usr/bin/tnameserv (tnameserv) in auto mode.
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/lib/jexec to provide /usr/bin/jexec (jexec) in auto mode.
Setting up openjdk-6-jre (6b24-1.11.5-0ubuntu1~10.04.2) ...
update-alternatives: using /usr/lib/jvm/java-6-openjdk/jre/bin/policytool to provide /usr/bin/policytool (policytool) in auto mode.
...

Bạn có thể thấy ở trên update-alternativesđược chạy để thiết lập liên kết cho các mã nhị phân Java khác nhau.

Sau khi cài đặt này, cũng có các liên kết trong /usr/bin, liên kết trong /etc/alternativesvà các tệp cho mỗi tệp nhị phân trong /var/lib/dpkg/alternatives.

ls -l /usr/bin/java /etc/alternatives/java /var/lib/dpkg/alternatives/java
lrwxrwxrwx 1 root root  40 2013-01-16 14:44 /etc/alternatives/java -> /usr/lib/jvm/java-6-openjdk/jre/bin/java
lrwxrwxrwx 1 root root  22 2013-01-16 14:44 /usr/bin/java -> /etc/alternatives/java
-rw-r--r-- 1 root root 158 2013-01-16 14:44 /var/lib/dpkg/alternatives/java

Hãy thỏa mãn điều này với việc cài đặt mà không cần xóa.

aptitude remove openjdk-6-jre
aptitude install --without-recommends openjdk-6-jre
Reading package lists... Done
Building dependency tree
Reading state information... Done
Reading extended state information
Initializing package states... Done
The following NEW packages will be installed:
  ca-certificates-java{a} java-common{a} libavahi-client3{a} libavahi-common-data{a} libavahi-common3{a} libcups2{a} libflac8{a} libgif4{a} libnspr4-0d{a} libnss3-1d{a} libogg0{a} libpulse0{a} libsndfile1{a} libvorbis0a{a} libvorbisenc2{a} libxi6{a} libxtst6{a}
  openjdk-6-jre openjdk-6-jre-headless{a} openjdk-6-jre-lib{a} tzdata-java{a}
The following packages are RECOMMENDED but will NOT be installed:
  icedtea-6-jre-cacao icedtea-netx ttf-dejavu-extra
0 packages upgraded, 21 newly installed, 0 to remove and 119 not upgraded.
Need to get 0B/34.5MB of archives. After unpacking 97.6MB will be used.
Do you want to continue? [Y/n/?]
Writing extended state information... Done
Selecting previously deselected package openjdk-6-jre-lib.
(Reading database ... 62293 files and directories currently installed.)
Unpacking openjdk-6-jre-lib (from .../openjdk-6-jre-lib_6b24-1.11.5-0ubuntu1~10.04.2_all.deb) ...
...
Processing triggers for man-db ...
...
Setting up openjdk-6-jre-headless (6b24-1.11.5-0ubuntu1~10.04.2) ...

Setting up openjdk-6-jre (6b24-1.11.5-0ubuntu1~10.04.2) ...
...

Như bạn thấy, update-alternativeskhông được kích hoạt.

Sau khi cài đặt này, không có tệp nào cho các tệp nhị phân Java trong /var/lib/dpkg/alternatives, không có liên kết trong /etc/alternativesvà không có liên kết nào trong /usr/bin.

Việc xóa các tệp /var/lib/dpkg/alternativescũng bị gián đoạn update-java-alternatives.


0

Ubuntu 12.04 này hoạt động ...

JAVA_HOME = / usr / lib / jvm / java-6-openjdk-i386 / jre


0

Là một bản cập nhật cho người dùng fedora, các lựa chọn thay thế đặt thư mục java hiện tại thành / usr / java / default

vì vậy bạn phải đặt JAVA_HOME của mình thành / usr / java / default để luôn có lựa chọn thay thế có thể chữa khỏi trong classpath của bạn

HTH!


0

Tôi luôn có xu hướng đặt JAVA_HOME theo /usr/bin/java.

JAVA_HOME="$(dirname -- "$(dirname -- "$(readlink -f /usr/bin/java)")")"

Bằng cách này, cả hai lựa chọn thay thế đều trỏ đến cùng một vị trí


-1

Vui lòng xem lệnh update-Alternatives có tác dụng gì (nó rất hay ...).

Trong thời gian ngắn - điều gì sẽ xảy ra khi bạn có java-sun-1.4 và java-opensouce-1.0 ... cái nào lấy "java"? Nó debian "/ usr / bin / java" là liên kết tượng trưng và "/usr/bin/java-sun-1.4" là một thay thế cho "/ usr / bin / java"

Chỉnh sửa: Như Richard đã nói, update-alternativesvẫn chưa đủ. Bạn thực sự cần sử dụng update-java-alternatives. Thông tin thêm tại:

https://help.ubuntu.com/community/Java


các lựa chọn thay thế cập nhật là không đủ. Nó cần phải được cập nhật-java-thay thế
RichieHH

@Richard: vâng, lưu ý. Lần đầu tiên tôi tìm hiểu về nó nên tôi đã truy cập vào Google và tìm thấy tài liệu của Ubuntu. Cảm ơn!
elcuco

-2

Mục tiêu chính xác của tôi luôn là tải xuống từ Sun và chỉ cần cài đặt theo cách đó. Sau đó, bạn biết chính xác mọi thứ đi vào thư mục nào.

Nhưng nếu bạn muốn gắn bó với cách cài đặt Debian kỳ lạ, tôi đoán tốt nhất sẽ là thư mục mẹ ngay phía trên nơi chứa các tệp nhị phân java và javac.

(vì khi bạn chỉ định nó trong đường dẫn của mình thì đó là $ JAVA_HOME / bin) (Vì vậy, trong trường hợp của bạn, nó sẽ là ... $ JAVA_HOME / share và $ JAVA_HOME sẽ là / usr?)

Ơ, nghe có vẻ không ổn ...

Tôi cũng muốn nghe câu trả lời cho điều này!


Khi sử dụng debian, bạn thực sự cần duy trì cấu trúc debian nếu không các bản cập nhật hệ thống sau này sẽ khiến bạn bị hỏng hệ thống.
RichieHH
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.