Коя е правилната цел за променливата на средата JAVA_HOME за базирана на Linux OpenJDK Debian дистрибуция?

В Windows JAVA_HOME трябва да сочи към инсталационната папка на JDK (така че JAVA_HOME/bin да съдържа всички изпълними файлове, а JAVA_HOME/libs да съдържа всички jar библиотеки по подразбиране).

Ако изтегля JDK пакета на Sun и го инсталирам в Linux, процедурата е същата.

Трябва обаче да използвам пакета OpenJDK по подразбиране на Kubuntu. Проблемът е, че всички изпълними файлове се поставят в /usr/bin. Но бурканите са поставени в /usr/share/java. Тъй като не са в една и съща папка JAVA_HOME, имам проблеми с Grails и може би ще има проблеми с други приложения, които очакват стандартната Java структура.

  1. Ако използвам:

    JAVA_HOME=/usr
    

    Всички приложения и скриптове, които искат да използват изпълним файл на Java, могат да използват стандартната процедура call $JAVA_HOME/bin/executable. Въпреки това, тъй като бурканите са на друго място, те не винаги се намират (пример: в grails получавам ClassDefNotFound за native2ascii).

  2. От друга страна, ако използвам:

    JAVA_HOME=/usr/share/java
    

    Нито един от изпълнимите файлове на Java (java, javac и т.н.) не може да бъде намерен.

И така, какъв е правилният начин за работа с променливата JAVA_HOME в базиран на Debian Linux?

Благодаря за помощта ти, Луис


person Luis Soeiro    schedule 19.03.2009    source източник


Отговори (14)


Това, което най-накрая проработи за мен (Grails вече работи безпроблемно), е почти както посочи Стив Б.:

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

По този начин, ако потребителят промени JDK по подразбиране за системата, JAVA_HOME все още работи.

default-java е символна връзка към текущата JVM.

person Luis Soeiro    schedule 19.03.2009
comment
Изглежда, че няма такава връзка на Debian 7 - person a1an; 09.01.2014
comment
На RHEL5.10 това е /usr/lib/jvm/java - person Engineer2021; 25.04.2014
comment
Използвах /usr/lib/jvm/java-7-openjdk-amd64 - person Randall Bohn; 06.08.2014
comment
За Oracle Linux 7 (това трябва да се отнася за CentOS и RHEL), създадох файл, наречен /etc/profile.d/java.sh, и го попълних със следното: JAVA_HOME=/usr/lib/ jvm/jre-openjdk експортиране на JAVA_HOME след пренасочване на /etc/profile (чрез стартиране на източник /etc/profile) JAVA_HOME беше попълнено според очакванията. - person darnold0714; 04.03.2020

Ако използвате алтернативи за управление на множество версии на Java, можете да зададете JAVA_HOME въз основа на свързаната със символи java (или javac) по следния начин:

export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::")
person bbaassssiiee    schedule 18.07.2012
comment
Това работи за мен: JAVA_HOME=$(readlink -f /usr/bin/java | sed s:/jre/bin/java::) - person dpnsan; 25.07.2013
comment
Брилянтно решение, решава дългогодишните ми главоболия с JAVA_HOME, който има тенденция да сочи към различни места на различни операционни системи. - person Datageek; 07.03.2014
comment
имайте предвид, че това умно решение няма да работи на дистрибуции като Gentoo, които имат /usr/bin/java сочещи към скрипт (/usr/libexec/eselect-java/run-java-tool.bash). все пак това е хубав подход. единственото нещо, което бих променил, е да използвам вграденото заместване на Bash, за да избегна раждането на sed, напр.: JAVA_HOME=$( j=$( readlink -f /usr/bin/java ) ; echo ${j%%/bin/java} ) - person RubyTuesdayDONO; 29.03.2014
comment
Това работи добре :) Може да искате да промените javac на java, защото не всеки има инсталиран JDK; само JRE - person Hanxue; 11.04.2014
comment
@AlexisWilke сега java вместо javac - person bbaassssiiee; 07.05.2016
comment
моята символна връзка /use/bin/java сочи към jre/bin/java, това причинява грешка по време на компилация, тъй като имам нужда да сочи към Java jdk home. - person user2441441; 04.04.2017

Стандартната инсталация на Ubuntu изглежда поставя различните версии на Java в /usr/lib/jvm. javac, java, който намирате в пътя си, ще направи мека връзка към това.

Няма проблем с инсталирането на вашата собствена версия на Java, където желаете, стига да зададете променливата на средата JAVA_HOME и да се уверите, че имате новата Java bin на пътя си.

Лесен начин да направите това е началната страница на Java да съществува като мека връзка, така че ако искате да надстроите или превключите версиите, трябва само да промените директорията, към която това сочи - напр.:

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

/opt/jdk --> /opt/jdk1.6.011
person Steve B.    schedule 19.03.2009
comment
опасно е да се препоръчват решения на Ubuntu с Debian. Те могат и наистина варират. - person RichieHH; 05.08.2010
comment
Обърнете внимание, че заявителят каза, че използва Kubuntu, така че решенията на Ubuntu трябва да са наред. - person Joseph Holsten; 26.05.2011

Обикновено нямам променлива на средата JAVA_HOME. Java може да го настрои сама. Вътре в java системното свойство java.home трябва да е налично.

person iny    schedule 19.03.2009
comment
Обикновено и аз го нямам. Ако обаче не го настроя, grails се оплаква, че JAVA_HOME не е там и прекъсва. - person Luis Soeiro; 19.03.2009
comment
ant също се нуждае от него в debian, което е контекстът - person RichieHH; 05.08.2010

Опитайте да зададете и променливата JAVA_LIB.

person Cantillon    schedule 19.03.2009

Ако имате проблеми с това, че JAR файловете не се намират, бих се уверил, че вашият CLASSPATH е настроен да включва местоположението на тези файлове. Намирам обаче, че CLASSPATH често трябва да се задава по различен начин за различните програми и често се оказва нещо, което да се задава уникално за отделните програми.

person MVang    schedule 14.03.2011

Актуализиран отговор, който ще реши проблема ви, а също и просто общи добри инструкции за инсталиране на Oracle Java 7 на Ubuntu, можете да намерите тук: http://www.wikihow.com/Install-Oracle-Java-on-Ubuntu-Linux

person Jack    schedule 12.06.2012

Открих подобни проблеми с пакетите openjdk-6-jre и openjdk-6-jre-headless в Ubuntu.

Проблемът ми беше решен чрез изчистване на пакетите openjdk-6-jre и openjdk-6-jre-headless и повторно инсталиране. Алтернативите се актуализират само при нова инсталация на пакетите openjdk-6-jre и openjdk-6-jre-headless.

По-долу е пример за инсталиране след прочистване:

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.
...

Можете да видите по-горе, че update-alternatives се изпълнява за настройка на връзки за различните двоични файлове на Java.

След тази инсталация има също връзки в /usr/bin, връзки в /etc/alternatives и файлове за всеки двоичен файл в /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

Нека сравним това с инсталирането без почистване.

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) ...
...

Както виждате, update-alternatives не се задейства.

След тази инсталация няма файлове за двоичните файлове на Java в /var/lib/dpkg/alternatives, няма връзки в /etc/alternatives и няма връзки в /usr/bin.

Премахването на файловете в /var/lib/dpkg/alternatives нарушава и update-java-alternatives.

person Saturn Junction    schedule 16.01.2013

Ubuntu 12.04 това работи...

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

person Alex    schedule 06.03.2013

Като актуализация за потребител на fedora, алтернативите задават текущата java директория на /usr/java/default

така че трябва да зададете вашия JAVA_HOME на /usr/java/default, за да имате винаги алтернативи, текуща селекция във вашия клас път

HTH !

person Greg Henry    schedule 06.09.2015

Винаги съм склонен да задавам JAVA_HOME според /usr/bin/java.

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

По този начин и двете алтернативи сочат към едно и също местоположение

person Ivo    schedule 21.11.2019

Доколкото си спомням, използвах скрипта update-java-alternatives вместо update-alternatives. И зададе JAVA_HOME за мен правилно.

person Tobias Schulte    schedule 20.03.2009
comment
В Ubuntu 20.4 го няма - person Martin Schröder; 09.11.2020

Моля, вижте какво прави командата update-alternatives (има хубав човек...).

Накратко - какво се случва, когато имате java-sun-1.4 и java-opensouce-1.0 ... кой приема "java"? Това debian "/usr/bin/java" е символна връзка и "/usr/bin/java-sun-1.4" е алтернатива на "/usr/bin/java"

Редактиране: Както каза Ричард, update-alternatives не е достатъчно. Всъщност трябва да използвате update-java-alternatives. Повече информация на:

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

person elcuco    schedule 19.03.2009
comment
алтернативите за актуализиране не са достатъчни. Трябва да е update-java-alternatives - person RichieHH; 05.08.2010
comment
@Ричард: да, отбелязано. За първи път се замислям за това, затова потърсих в Google и намерих документацията на Ubuntu. Благодаря! - person elcuco; 11.08.2010

Правилната ми цел винаги е била да го изтегля от Sun и просто да го инсталирам по този начин. Тогава знаете точно в коя директория отива всичко.

Но ако предпочитате да се придържате към странния начин, по който Debian го инсталира, най-доброто ми предположение би било родителската директория точно над мястото, където се намират двоичните файлове на java и javac.

(тъй като когато го посочите в пътя си, това е $JAVA_HOME/bin) (Така че във вашия случай ще бъде ... $JAVA_HOME/share и $JAVA_HOME ще бъде /usr?)

Ех, това не звучи правилно...

И на мен ми е интересно да чуя отговора на това!

person leeand00    schedule 19.03.2009
comment
Когато използвате debian, наистина трябва да се придържате към структурите на debian или по-късните системни актуализации ще ви оставят със счупена система. - person RichieHH; 05.08.2010