W wersji 12.04 Ubuntu można Javę 7 zainstalować dużo prościej, korzystając z repozytoriów PPA. Wystarczy dodać odpowiednie repozytorium i zainstalować Javę:

sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java7-installer

Java zostanie pobrana ze strony Oracle, zainstalowana i odpowiednie powiązania zostaną automatycznie ustawione.

Więcej można przeczytać tutaj: Install Oracle Java in Ubuntu via PPA repository.

Java w wersji 7 został wydana jakiś czas temu, ale ciągle nie ma odpowiednich pakietów do instalacji w Ubuntu. Pewnie pojawią się wraz z edycją 11.10, ale czekać tak długo nie mam ochoty :).

Instalacja nowej wersji Javy sprowadza się do wykonania kilku kroków, jedyną niedogodnością jest konieczność ręcznego pilnowania nowych wydań JDK.

  1. Pobranie pakietu z Java, najlepiej ze strony Oracle: Java SE Development Kit 7 Downloads. Mój plik z JDK nazywa się jdk-7-linux-x64.tar.gz.
  2. Rozpakować archiwum:
    tar xzvf jdk-7-linux-x64.tar.gz

    Zostanie utworzony katalog jdk1.7.0 a w nim Java w wersji 7.

  3. Przenieść rozpakowane archiwum do katalogu /usr/lib/jvm/ pod nazwą java-7-oracle, gdzie znajdują się dostępne wersje JVM w systemie.

    Ten i pozostałe kroki muszą być wykonane z uprawnieniami użytkownika root. Należy więc wcześnie zmienić konto lub używać polecenie sudo.

    mv jdk1.7.0 /usr/lib/jvm/java-7-oracle
  4. Ustawić odpowiedniego użytkownika oraz uprawnienia – właścicielem powinien być root a możliwość odczytu i wykonywania aplikacji powinni mieć wszyscy użytkownicy. Nie jest to krok być może konieczny, ale przy niektórych ustawianiach jego brak może uniemożliwić innym użytkownikom korzystania z Javy.
    chown -R root.root /usr/lib/jvm/jdk1.7.0/java-7-oracle

    Jeżeli jednak umask jest ustawiony na bardziej restrykcyjną wartość (w moim przypadku 007) to pojawi się problem: zwykły użytkownik nie będzie mógł ani uruchomić ani nawet odczytać katalogu z Javą. Można to poprawić przy użyciu prostej instrukcji:

    chmod -R a+rX /usr/lib/jvm/java-7-oracle
  5. W Ubuntu domyślne implementacja Javy (jak i wielu innych aplikacji) jest ustawiana przy pomocy polecenia update-alternatives. Mechanizm ten pozwala na zdefiniowania wielu rożnych aplikacji dostarczających daną funkcjonalność (np. wiele wersji Javy) oraz wybranie aplikacji, która będzie uruchamiana domyślnie.

    W przypadku polecenia java można sprawdzić jakie są jego różne implementacje:

    # update-alternatives --config java

    There are 3 choices for the alternative java (providing /usr/bin/java).

      Wybór       Ścieżka                                 Priorytet  Status
    ------------------------------------------------------------
      0            /usr/lib/jvm/java-6-openjdk/jre/bin/java   1061      tryb auto
      1            /usr/lib/jvm/java-6-openjdk/jre/bin/java   1061      tryb ręczny
    * 2            /usr/lib/jvm/java-6-sun/jre/bin/java       63        tryb ręczny

    W moim przypadku mam zainstalowane dwa różne JDK, z czego domyślnie ustawiona jest wersja Suna (teraz już Oracla).

    Można teraz dodać implementację Java 7:

    update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-7-oracle/jre/bin/java 3

    Numer 3 oznacza kolejny numer po ostatniej dostępnej wersji JVM.

    Teraz pozostaje tylko wydanie polecenia:

    update-alternatives --config java

    A teraz mały test: wywołanie poleceń java oraz javac:

    # java -version
    java version "1.7.0"
    Java(TM) SE Runtime Environment (build 1.7.0-b147)
    Java HotSpot(TM) 64-Bit Server VM (build 21.0-b17, mixed mode)

    # javac -version
    javac 1.6.0_26

    Jak widać domyślnie została wywołana wersja Javy 7, natomiast wywołanie kompilator ciągle odwołuje się do wersji 6. Poradzić sobie można z tym definiując kolejną alternatywę a następnie ją ustawiając. Natomiast ilość plików binarnych które trzeba ustawić oraz stron MAN, które należy zmienić jest znaczna. Można to sprawdzić przy pomocy polecenia:

    update-java-alternatives -v -l java-6-sun
  6. Najlepszym sposobem zmiany wersji JDK w przypadku Ubuntu będzie użycie polecenia update-java-alternatives. Pozwoli ona na zmianę domyślnej implementacji wszystkich plików wykonywalnych oraz powiązanych z nimi stron MAN. Niestety, trzeba je odpowiednio skonfigurować, zanim zacznie działać poprawnie.

    Pierwszym krokiem będzie dodanie odpowiednich alternatyw dla wszystkich plików binarnych. Można to zrobić przy pomocy prostego skryptu o nazwie update-alternatives-java-7. Powstał on na bazie odpowiednich skryptów po instalacyjnych wykonywanych podczas instalacji OpenJDK w systemie.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    #!/bin/bash

    # instalacja JRE-headless

    priority=100
    basedir=/usr/lib/jvm/java-7-oracle
    basediralias=/usr/lib/jvm/java-7-oracle
    jdiralias=java-7-oracle
    mandir=/usr/lib/jvm/jdk1.7.0/man
    srcext=1.gz
    dstext=1.gz

    jre_tools='java keytool pack200 rmid rmiregistry unpack200 orbd servertool tnameserv'
                                                                                                                                                                                                                               
        for i in $jre_tools; do                                                                                                                                                                                                
            unset slave1 slave2 || true                                                                                                                                                                                        
            if [ -e $mandir/man1/$i.$srcext ]; then                                                                                                                                                                            
                slave1="--slave \                                                                                                                                                                                              
                    /usr/share/man/man1/$i.$dstext \                                                                                                                                                                            
                    $i.$dstext \                                                                                                                                                                                                
                    $mandir/man1/$i.$srcext"
                                                                                                                                                                                       
            fi                                                                                                                                                                                                                  
            update-alternatives --verbose \                                                                                                                                                                                    
                --install \                                                                                                                                                                                                    
                /usr/bin/$i \                                                                                                                                                                                                  
                $i \                                                                                                                                                                                                            
                $basediralias/jre/bin/$i \                                                                                                                                                                                      
                $priority \                                                                                                                                                                                                    
                $slave1 $slave2                                                                                                                                                                                                
        done                                                                                                                                                                                                                    
        update-alternatives --verbose \                                                                                                                                                                                        
            --install /usr/bin/jexec jexec $basediralias/jre/lib/jexec $priority                                                                                                                                                
                                                                                                                                                                                                                               
                                                                                                                                                                                                                               
    # instalacja JRE

    jre_tools='policytool ControlPanel java_vm javaws jcontrol'

        for i in $jre_tools; do
            unset slave1 slave2 || true
            if [ -e $mandir/man1/$i.$srcext ]; then
                slave1="--slave \
                   /usr/share/man/man1/$i.$dstext \
                   $i.$dstext \
                   $mandir/man1/$i.$srcext"

            fi
            update-alternatives --verbose \
                --install \
                /usr/bin/$i \
                $i \
                $basediralias/jre/bin/$i \
                $priority \
                $slave1 $slave2
        done

    # instalacja JDK


    jdk_tools='appletviewer apt extcheck idlj jar jarsigner javac javadoc javah javap jconsole jdb jhat jinfo jmap jps jrunscript jsadebugd jstack jstat jstatd native2ascii rmic schemagen serialver wsgen wsimport xjc'


        for i in $jdk_tools; do
            unset slave1 slave2 || true
            if [ -e $mandir/man1/$i.$srcext ]; then
                slave1="--slave \
                   /usr/share/man/man1/$i.$dstext \
                   $i.$dstext \
                   $mandir/man1/$i.$srcext"

            fi
            update-alternatives --verbose \
                --install \
                /usr/bin/$i \
                $i \
                $basediralias/bin/$i \
                $priority \
                $slave1 $slave2
        done

    W skrypcie należy zwrócić szczególną uwagę na definicję odpowiednich ścieżek dostępu. Po jego wykonaniu zostaną zdefiniowanie odpowiednie alternatywy dla odpowiednich plików, ale nie zostaną one jeszcze uaktywnione.

    Konfiguracja update-java-alternatives sprowadza się do zdefiniowania odpowiedniego pliku konfiguracyjnego. Należy utworzyć (lokalizacja i nazwa pliku jest ważna) plik: /usr/lib/jvm/.java-7-oracle.jinfo o następującej zawartości:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    name=java-7-oracle
    alias=java-7-oracle
    priority=100
    section=non-free

    jre ControlPanel /usr/lib/jvm/java-7-oracle/jre/bin/ControlPanel
    jre java /usr/lib/jvm/java-7-oracle/jre/bin/java
    jre java_vm /usr/lib/jvm/java-7-oracle/jre/bin/java_vm
    jre javaws /usr/lib/jvm/java-7-oracle/jre/bin/javaws
    jre jcontrol /usr/lib/jvm/java-7-oracle/jre/bin/jcontrol
    jre keytool /usr/lib/jvm/java-7-oracle/jre/bin/keytool
    jre pack200 /usr/lib/jvm/java-7-oracle/jre/bin/pack200
    jre policytool /usr/lib/jvm/java-7-oracle/jre/bin/policytool
    jre rmid /usr/lib/jvm/java-7-oracle/jre/bin/rmid
    jre rmiregistry /usr/lib/jvm/java-7-oracle/jre/bin/rmiregistry
    jre unpack200 /usr/lib/jvm/java-7-oracle/jre/bin/unpack200
    jre orbd /usr/lib/jvm/java-7-oracle/jre/bin/orbd
    jre servertool /usr/lib/jvm/java-7-oracle/jre/bin/servertool
    jre tnameserv /usr/lib/jvm/java-7-oracle/jre/bin/tnameserv
    jre jexec /usr/lib/jvm/java-7-oracle/jre/lib/jexec
    jdk appletviewer /usr/lib/jvm/java-7-oracle/bin/appletviewer
    jdk apt /usr/lib/jvm/java-7-oracle/bin/apt
    jdk extcheck /usr/lib/jvm/java-7-oracle/bin/extcheck
    jdk idlj /usr/lib/jvm/java-7-oracle/bin/idlj
    jdk jar /usr/lib/jvm/java-7-oracle/bin/jar
    jdk jarsigner /usr/lib/jvm/java-7-oracle/bin/jarsigner
    jdk javac /usr/lib/jvm/java-7-oracle/bin/javac
    jdk javadoc /usr/lib/jvm/java-7-oracle/bin/javadoc
    jdk javah /usr/lib/jvm/java-7-oracle/bin/javah
    jdk javap /usr/lib/jvm/java-7-oracle/bin/javap
    jdk jconsole /usr/lib/jvm/java-7-oracle/bin/jconsole
    jdk jdb /usr/lib/jvm/java-7-oracle/bin/jdb
    jdk jhat /usr/lib/jvm/java-7-oracle/bin/jhat
    jdk jinfo /usr/lib/jvm/java-7-oracle/bin/jinfo
    jdk jmap /usr/lib/jvm/java-7-oracle/bin/jmap
    jdk jps /usr/lib/jvm/java-7-oracle/bin/jps
    jdk jrunscript /usr/lib/jvm/java-7-oracle/bin/jrunscript
    jdk jsadebugd /usr/lib/jvm/java-7-oracle/bin/jsadebugd
    jdk jstack /usr/lib/jvm/java-7-oracle/bin/jstack
    jdk jstat /usr/lib/jvm/java-7-oracle/bin/jstat
    jdk jstatd /usr/lib/jvm/java-7-oracle/bin/jstatd
    jdk native2ascii /usr/lib/jvm/java-7-oracle/bin/native2ascii
    jdk rmic /usr/lib/jvm/java-7-oracle/bin/rmic
    jdk schemagen /usr/lib/jvm/java-7-oracle/bin/schemagen
    jdk serialver /usr/lib/jvm/java-7-oracle/bin/serialver
    jdk wsgen /usr/lib/jvm/java-7-oracle/bin/wsgen
    jdk wsimport /usr/lib/jvm/java-7-oracle/bin/wsimport
    jdk xjc /usr/lib/jvm/java-7-oracle/bin/xjc

    Teraz jest już dostępna nowa wersja JVM w systmie:

    # update-java-alternatives -l
    java-6-openjdk 1061 /usr/lib/jvm/java-6-openjdk
    java-6-sun 63 /usr/lib/jvm/java-6-sun
    java-7-oracle 100 /usr/lib/jvm/java-7-oracle

    Pozostaje ustawić Jave 7 jako domyślną implementację JVM:

    update-java-alternatives -v -s java-7-oracle

Źródła