Tycho: Bundle X - Missing Constraint: Bundle-RequiredExecutionEnvironment: JavaSE-1.7

Jmini picture Jmini · Oct 13, 2014 · Viewed 7.5k times · Source

I have changed the BREE from JavaSE-1.6 to JavaSE-1.7 in the manifest files of my application:

Bundle-RequiredExecutionEnvironment: JavaSE-1.7

Now I can not compile the application again.

When I run mvn clean install I get:

[INFO] Resolving dependencies of MavenProject: Xgroup:X:4.0.100-SNAPSHOT @ C:\Users\....\X\pom.xml
[WARNING] The following locally built units have been used to resolve project dependencies:
[WARNING]   Za
[WARNING]   Zb
[INFO] Resolving class path of MavenProject: Xgroup:X:4.0.100-SNAPSHOT @ C:\Users\....\X\pom.xml
[ERROR] Internal error: java.lang.RuntimeException: org.osgi.framework.BundleException: Bundle X cannot be resolved
[ERROR] Resolution errors:
[ERROR] Bundle X - Missing Constraint: Bundle-RequiredExecutionEnvironment: JavaSE-1.7
[ERROR] -> [Help 1]
org.apache.maven.InternalErrorException: Internal error: java.lang.RuntimeException: org.osgi.framework.BundleException: Bundle X cannot be resolved
Resolution errors:
   Bundle X - Missing Constraint: Bundle-RequiredExecutionEnvironment: JavaSE-1.7

My toolchains.xml contains:

  <toolchain>
     <type>jdk</type>
     <provides>
         <version>1.7</version>
         <vendor>sun</vendor>
         <id>JavaSE-1.7</id>
     </provides>
     <configuration>
        <jdkHome>C:\Java\jdk1.7.0_45</jdkHome>
     </configuration>
  </toolchain>

When I run mvn -version the Java version seems to be OK:

Apache Maven 3.0.4 (r1232337; 2012-01-17 09:44:56+0100)
Maven home: C:\Tools\apache-maven-3.0.4\bin\..
Java version: 1.7.0_17, vendor: Oracle Corporation
Java home: C:\Java\jdk1.7.0_17\jre
Default locale: en_US, platform encoding: Cp1252
OS name: "windows 7", version: "6.1", arch: "x86", family: "windows"

I guess my JAVA_HOME is correct, but I am not sure. echo %JAVA_HOME% prints C:\Java\jdk1.7.0_17\jre. A related problem on the Tycho-Mailing list was solved by setting JAVA_HOME correctly, but my problem seems to be different.

I'm using Tycho in version 0.19.0. I have also tried a newer version, but this didn't change anything.

Answer

oberlies picture oberlies · Oct 14, 2014

Have a close look into the log message - it is not unlikely that you get the error message

[ERROR] Bundle X - Missing Constraint: Bundle-RequiredExecutionEnvironment: JavaSE-1.7

while Tycho resolves dependencies and the compile class path of a different bundle project Y which depends on bundle X. Find the last one of the following log messages prior to the error:

[INFO] Resolving class path of MavenProject: ...

This line shows which project has the resolution problem.


If the failing project is in fact a different bundle Y which depends on bundle X, you should check the Bundle-RequiredExecutionEnvironment header of bundle Y: If bundle Y declares e.g. a BREE of JavaSE-1.6, it is expected that the build fails. The reason for this is as follows: Unless configured otherwise, Tycho assumes that you want to run bundle Y in OSGi container that provides the execution environment specified in the BREE header. In the example this would be an OSGi container on a JavaSE-1.6 VM. However in such a container, Y could not be started because it depends on X which can not be started. This is what Tycho detects and why the build fails.

You can deal with this situation in different ways:

  • Also change the BREE header of bundle Y. This in particular makes sense if you know that Y will will anyway always run together with the version of bundle X which requires JavaSE-1.7.

  • Configure the execution environment for bundle Y separately from the BREE header, e.g. via the executionEnvironment target platform configuration (not recommended). This may also change the JRE that bundle Y is compiled for, so bundle Y may then in fact no longer run on Java 6. So only use this option if you fully understand the implications of the execution environment on the build.

  • Disable Tycho's checks for execution environment constraints by setting the target platform configuration parameter resolveWithExecutionEnvironmentConstraints to false (since Tycho 0.22.0). This may make sense if your bundle Y may run with a completely different version or implementation of bundle X than the version you use at compile time.


If the failing project is the bundle X project itself, there is some configuration in the (parent) POM or the build.properties which makes Tycho use a different, lower execution envirionment than the one specified in the Bundle-RequiredExecutionEnvironment header of bundle X (see documentation on the execution environment configuration for details). You should probably remove this conflicting, redundant configuration.