Wybieramy Javę

Java to mały koszmarek. Nie było tak źle, póki mieliśmy Suna, ale od czasów Oracle trochę się pomieszało. Jedno chce openjdk, drugie Oracle, trzecie JRE, czwart JDK, piąte działa szybciej na jednej, a szóste zawiesza się na trzeciej. 🙂

W pewnych innych przypadkach zrobilibyśmy po prostu virtualenva, ale Java tak nie umie. O ile twórca programu nie zrobił małego skryptu pilnującego wersji Javy, która uruchamia jego program, trzeba zadbać o to samemu. Pewnym rozwiązaniem jest zrobić aliasy w bashu, co wystarczy do uruchamiania JARów, ale na Eclipse jest to za mało:

alias sjava='/usr/java/default/bin/java -jar'

Powyższe znacznie ułatwia uruchamianie małych programików z JRE pobranego ze stronki www.java.com. Jednak wspomniamy Eclipse… Swego czasu był parametr służący do wybierania JDK, ale komuś się nie podobał i go usunęli. Zostajemy więc z czysto linuksowym sposobem na wybieranie wersji binarki, czyli alternatives. Tak to się robi:

sudo update-alternatives --install "/usr/bin/javac" "javac" "/home/lukasz/.AndroidStudio2.0/java/jdk1.8.0_77/bin/javac" 1
sudo update-alternatives --install "/usr/bin/java" "java" "/home/lukasz/.AndroidStudio2.0/java/jdk1.8.0_77/bin/java" 1

W moim przypadku skopiowałem sobie całe JDK od Oracle do katalogu ~/.AndroidStudio2.0, żeby mieć wszystko w jednym miejscu. Stary Eclipse też tam siedzi. Jest więc niezły bałagan (5689 directories, 35516 files), ale mogę sobie zrobić archiwum gzipem i jest kopia robocza wszystkiego.

Wracając do tematu: co właściwie daje użycie alternatives? Tworzy dowiązania w katalogu /etc/alternatives, z którymi musimy teraz dojść do ładu:

ls -al /etc/alternatives/ | grep java
lrwxrwxrwx.   1 root root    56 04-24 10:00 java -> /home/lukasz/.AndroidStudio2.0/java/jdk1.8.0_77/bin/java
lrwxrwxrwx.   1 root root    57 04-24 10:00 javac -> /home/lukasz/.AndroidStudio2.0/java/jdk1.8.0_77/bin/javac
lrwxrwxrwx.   1 root root    62 04-16 19:06 jre_1.8.0 -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.77-1.b03.fc23.x86_64/jre
lrwxrwxrwx.   1 root root    62 04-16 19:06 jre_1.8.0_exports -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.77-1.b03.fc23.x86_64/jre
lrwxrwxrwx.   1 root root    66 04-16 19:06 jre_1.8.0_openjdk_exports -> /usr/lib/jvm-exports/java-1.8.0-openjdk-1.8.0.77-1.b03.fc23.x86_64
lrwxrwxrwx.   1 root root    62 04-16 19:06 jre_openjdk -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.77-1.b03.fc23.x86_64/jre
lrwxrwxrwx.   1 root root    62 04-16 19:06 jre_openjdk_exports -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.77-1.b03.fc23.x86_64/jre

Postaramy się za chwilę to opanować. Służy do tego program update-alternatives:

sudo update-alternatives --config javac
sudo update-alternatives --config java

Jest on „pseudograficzny”. Wystarczy wpisać liczbę odpowiadającą preferowanym przez nas javac oraz java, nacisnąć enter i program poprawi dowiązania w /etc/alternatives. Eclipse będzie się w końcu uruchamiał z Javy Oracle, a nie Open JDK. Pewnym efektem ubocznym jest wolniejsze uruchamianie, ale Eclipse jest bardziej testowany na Javie od Oracle. Jeżeli chcecie programować dla Androida używając wtyczki Eclipse, to nawet nie ma innego wyjścia i trzeba używać Javy Oracle.