Java is a programming language developed by engineers of Sun Microsystems. The language is object-oriented and designed to run on multiple platforms without the need of recompiling code for each platform. Although Java can be compiled as a native program, much of Java's popularity can be attributed to its portability, along with other features such as garbage collection. To make platform independence possible the Java compiler compiles the Java code to an intermediate representation called "Java bytecode" that runs on a JRE (Java Runtime Environment) and not directly on the operating system.
In order to run Java bytecode, one needs to have a JRE (Java Runtime Environment) installed. A JRE provides core libraries, a platform dependent Java Virtual Machine, plug-ins for browsers, among other things. A JDK (Java Development Kit) adds programming tools, such as a bytecode compiler and a debugger.
The way Java is handled on Gentoo has recently seen many changes and improvements. This has only happened very recently, and as a result, all the packages related to it are marked with testing keywords, ie ~x86. This document assumes you are using the new system.
If you are using the stable tree, i.e. x86, ppc, or amd64 as opposed to ~x86,
~ppc, or ~amd64, you will need to add some entries to your
# Core Gentoo/Java Packages dev-java/ant-core dev-java/ant-tasks dev-java/ant dev-java/java-config dev-java/java-config-wrapper dev-java/javatoolkit # JDKs =dev-java/sun-jdk-1.4* =dev-java/sun-jdk-1.5* =dev-java/ibm-jdk-bin-1.4* =dev-java/ibm-jdk-bin-1.5* =dev-java/jrockit-jdk-bin-1.4* =dev-java/jrockit-jdk-bin-1.5* =dev-java/blackdown-jdk-1.4* dev-java/kaffe # JREs =dev-java/sun-jre-bin-1.4* =dev-java/sun-jre-bin-1.5* =dev-java/ibm-jre-bin-1.4* =dev-java/blackdown-jre-1.4* # Virtuals virtual/jdk virtual/jre # Compilers dev-java/eclipse-ecj dev-java/jikes # Documentation dev-java/java-sdk-docs # Misc packages that have been updated to generation-2, # where the generation-1 won't build and/or run properly dev-java/lucene # These have optional Java support, but need ~arch to function properly # with generation-2 dev-util/subversion sys-libs/db
For existing installs, regardless of if you have installed anything Java
before, make sure you have followed the
New installs should require no further preparation.
Gentoo provides numerous Runtime Environments (JREs) and Development Kits (JDKs). Among the current choices, we have:
| Vendor | JDK | JRE |
|---|---|---|
The default is Blackdown for both the JRE and the JDK, as it is freely ("free as in beer") available without any registration fuss.
The default for Java 1.4 is the Blackdown JRE/JDK pair, as it is freely ("free as in beer") available without any registration fuss.
JREs and JDKs from Sun, IBM, and BEA are generally faster, but getting them is a bit more work, as you are required to read and accept their license before downloading (IBM additionally requires you to register).
To install your profile's default JDK, you can run
In recent events, Sun has relicensed their JDK and JRE under a more Linux distro friendly license. As a result, Sun releases Java 1.5 and onwards are freely downloadable, without any further hassle.
As already mentioned, some of the JDKs and JREs require you to jump through a few hoops before installing. Simply emerge the packages as you normally would. The ebuilds will then instruct you where to go and what to download.
You should download the indicated file(s) into
Gentoo has the ability to have multiple JDKs and JREs installed without causing conflicts.
Using the
Running the command
# java-config --list-available-vms 1) Blackdown JDK 1.3.1 [blackdown-jdk-1.3] (/etc/env.d/java/20blackdown-jdk-1.3) 2) Blackdown JDK 1.4.2.02 [blackdown-jdk-1.4] (/etc/env.d/java/20blackdown-jdk-1.4) 3) Blackdown JRE 1.4.2.02 [blackdown-jre-1.4] (/etc/env.d/java/20blackdown-jre-1.4) 4) IBM JDK 1.4.2 [ibm-jdk-bin-1.4] (/etc/env.d/java/20ibm-jdk-bin-1.4) 5) IBM JRE 1.4.2 [ibm-jre-bin-1.4] (/etc/env.d/java/20ibm-jre-bin-1.4) 6) WebLogic JRockit 1.4.2.05 [jrockit-jdk-bin-1.4] (/etc/env.d/java/20jrockit-jdk-bin-1.4) 7) WebLogic JRockit 1.5.0.03 [jrockit-jdk-bin-1.5] (/etc/env.d/java/20jrockit-jdk-bin-1.5) 8) Sun JDK 1.3.1.13 [sun-jdk-1.3] (/etc/env.d/java/20sun-jdk-1.3) 9) Sun JDK 1.4.2.09 [sun-jdk-1.4] (/etc/env.d/java/20sun-jdk-1.4) *) Sun JDK 1.5.0.04 [sun-jdk-1.5] (/etc/env.d/java/20sun-jdk-1.5) 11) Sun JRE 1.4.2.09 [sun-jre-bin-1.4] (/etc/env.d/java/20sun-jre-bin-1.4) 12) Sun JRE 1.5.0.04 [sun-jre-bin-1.5] (/etc/env.d/java/20sun-jre-bin-1.5)
The
(By handle (preferred)) # java-config --set-system-vm blackdown-jdk-1.4(By number) # java-config --set-system-vm 2
As a regular user, you can use
While merging Java packages, the VM can and will be switched as necessary.
Because of the wide variety of available VMs, we do not have the resources to
test and verify every package works on all of them. So to ensure that every
packages merges smoothly, we have defined a list of
The merge time VM switching is also needed when, for example, your system-vm is set a 1.4 VM and the package you are merging requires a 1.5 VM. While merging it will use the preferred 1.5 VM, leaving your system-vm choice intact.
Of course, Gentoo is all about choice, so you can override these defaults in
(I always want it to use a sun-jdk, ie sun-jdk-1.4 for 1.4, sun-jdk-1.5 for 1.5, etc) *=sun-jdk
(Always use sun-jdk-1.5 wherever possible, except for when a 1.4 or 1.3 VM is explicitly required) *=sun-jdk-1.5
# For 1.3 I prefer sun-jdk 1.4 but when it is not available, use ibm-jdk-bin, # For 1.4, use blackdown-jdk, and for 1.5, use sun-jdk 1.3=sun-jdk-1.4 ibm-jdk-bin 1.4=blackdown-jdk 1.5=sun-jdk
The standard Java compiler used for building is javac, which comes with each
JDK. In addition to configuring the VM used at build time, it is also possible
configure which compiler is used. Essentially, you define a list your
preference for which compiler to use in
# If the ebuild supports it # it will check the COMPILERS var front to back and # use the first compiler that is installed COMPILERS="ecj-3.1 jikes javac"
Some compilers don't support all possible -target and -source arguments. Therefore, each compiler in the list is checked to see if it can support the desired -source/-target. javac will work in all cases, so if no other suitable compiler is found, it will be used instead.
More details about each compiler are provided below:
| Name | Handle | Package | Description |
|---|---|---|---|
First, you will want to list available Java libraries installed on your system that might want to be put in your CLASSPATH. Here is an example of output:
# java-config --list-available-packages [xerces-2] The next generation of high performance, fully compliant XML parsers in the Apache Xerces family (/usr/share/xerces-2/package.env) [junit] Simple framework to write repeatable tests (/usr/share/junit/package.env) [bsh] BeanShell: A small embeddable Java source interpreter (/usr/share/bsh/package.env) [bcel] The Byte Code Engineering Library: analyze, create, manipulate Java class files (/usr/share/bcel/package.env) [log4j] A low-overhead robust logging package for Java (/usr/share/log4j/package.env) ...
Again, the names in brackets (
# java-config --set-system-classpath log4j,xerces-2
You will have to update your environment by logging out, then in again or
sourcing
For users,
if [[ -f "${HOME}/.gentoo/java-env-classpath" ]]; then
source ${HOME}/.gentoo/java-env-classpath
fi
If you really want a system wide or user default classpath you can add something like the following to your shell's profile. But we would advise against it.
# export CLASSPATH="${CLASSPATH}:$(java-config --classpath log4j,xerces-2)"
For more information regarding USE flags, refer to the