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.
Gentoo provides numerous JREs and JDKs. Among the current alternatives, 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.
Both the Sun and the IBM are generally faster, but getting them is a bit more hassle, as you are required to read and accept their license before downloading (IBM additionally requires you to register).
Our ebuilds for the Sun and IBM JRE/JDKs will inform you how to download the appropriate files.
To install your profile's default JDK, you can run
If you run
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 relogging in 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 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