# Setting the Compilation Environment

By default, your bundles will be compiled with whichever JRE is being used to run the build and with source and target levels set to 1.3 and 1.2.

PDE build is capable of configuring the JRE used during compilation on a per bundle basis. To take advantage of this, the first thing to do is to tell PDE build which JREs you have available. In your build configuration build.properties file, set properties to point to each of your installed JREs. The template build.properties provided in org.eclipse.pde.build/templates/headless-build has a list of environments commented out. Simply uncomment the properties for which you have JREs and set the value to be the set of jars that belong on the boot classpath. For example, setting the property:

`J2SE-1.5=C:/Java/1.5/jre/lib/rt.jar;C:/Java/1.5/jre/lib/jsse.jar`

will compile bundles requiring java 1.5 against rt.jar and jsse.jar. The names of the properties should match the names of the environments that PDE Build knows about. PDE Build will automatically set the source and target levels for each environment. The environments that PDE builds knows and their associated source/target levels are as follows:

Environment | Source | Target
CDC-1.0/Foundation-1.0 | 1.3 | 1.1
CDC-1.1/Foundation-1.1 | 1.3 | 1.2
OSGi/Minimum-1.0 | 1.3 | 1.1
OSGi/Minimum-1.1 | 1.3 | 1.2
JRE-1.1 | 1.1 | 1.1
J2SE-1.2 | 1.2 | 1.1
J2SE-1.3 | 1.3 | 1.1
J2SE-1.4 | 1.3 | 1.2
J2SE-1.5 | 1.5 | 1.5
JavaSE-1.6 | 1.6 | 1.6
PersonalJava-1.1 | 1.1 | 1.1
PersonalJava-1.2 | 1.1 | 1.1
CDC-1.0/PersonalBasis-1.0 | 1.3 | 1.1
CDC-1.0/PersonalJava-1.0 | 1.3 | 1.1
CDC-1.1/PersonalBasis-1.1 | 1.3 | 1.2
CDC-1.1/PersonalJava-1.1 | 1.3 | 1.2

## Choosing the Environment for your Bundle

There are two settings that affect the environment used to compile your bundle. One is the manifest header Bundle-RequiredExecutionEnvironment. This header is a list of environments on which your bundle is able to run. Your bundle should only use methods that are in the proper subset of all the environments listed. It is desirable to have your compilation environment match your runtime environment as closely as possible.
The second setting is the property jre.compilation.profile from your bundle's build.properties file. The value of this property should be the prefered environment for compiling this bundle if the Bundle-RequiredExecutionEnvironment list is not adequate.
These two settings together form a list of environments, jre.compilation.profile first, then the environments from Bundle-RequiredExecutionEnvironment. The first environment on this list that is available in your build configuration (see above section) will be used to compile your bundle.
Example:

    <buildDirectory>/plugins/bundleA/
    	META-INF/manifest.mf: Bundle-RequiredExecutionEnvironment: CDC-1.0/Foundation-1.0, J2SE-1.3
    	build.properties:     jre.compilation.profile=J2SE-1.4

    <buildConfiguration>/
    	build.properties:  J2SE-1.3=C:/Java1.3/jre/lib/rt.jar;C:/Java1.3/jre/lib/i18n.jar
    			   J2SE-1.4=C:/Java1.4/jre/lib/rt.jar;C:/Java1.4/jre/lib/jsse.jar

In the above setup, the list of environments considered (in order) is: J2SE-1.4, CDC-1.0/Foundation-1.0, J2SE-1.3. The bundle can run on CDC/Foundation and J2SE-1.3, but for some reason, it should be compiled with J2SE-1.4. In this case, J2SE-1.4 is set in the build configuration, and comes first in the list of environments, so it is used to compile the bundle. The source and target levels used in this case are 1.3 and 1.2. If instead, the build configuration defined only J2SE-1.3 and not J2SE-1.4, then J2SE-1.3 would be the only environment on the list for which a JRE is available, so it would be used to compile the bundle. In that case, the source and target levels would be 1.3 and 1.1.

## Explicitly Setting Compilation values

If, for some reason, using the enviroments as outlined above does not result in the desired setup, then it is possible for a bundle to explicitly list the settings it requires. For example, if you have a bundle that uses J2SE-1.4 with asserts, then the source and target levels would need to be 1.4, instead of the default 1.3 and 1.2.
To explicitly set the java source and target levels, the bundle should set the properties `javacSource` and `javacTarget` in it's build.properties file. These properties will override the values derived from the environment settings.
Similarily, setting the property `bootClasspath` in the bundle's build.properties file will override the set of jars the bundle is compiled against.