Tycho: Bundle X - 缺少约束项: Bundle-RequiredExecutionEnvironment: JavaSE-1.7

5

我已经在我的应用程序的清单文件中将BREE从JavaSE-1.6更改为JavaSE-1.7:

Bundle-RequiredExecutionEnvironment: JavaSE-1.7

现在我无法再次编译该应用程序。

当我运行mvn clean install时,出现以下错误:

[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

我的 toolchains.xml 包含:

  <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>

当我运行 mvn -version 命令时,Java 版本似乎是正确的:
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"

我猜测我的JAVA_HOME是正确的,但我不确定。 echo %JAVA_HOME% 打印出 C:\Java\jdk1.7.0_17\jre。Tycho邮件列表中的相关问题通过正确设置JAVA_HOME得到解决,但我的问题似乎不同。
我正在使用版本为0.19.0的Tycho。我也尝试过更新版本,但这并没有改变任何事情。

非常好的问题,顺便说一句!感谢您扩展日志片段,这使得它对未来的读者更加有用 :-) - oberlies
2个回答

8

仔细查看日志信息-很有可能会出现错误消息。

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

当Tycho解析依赖项以及依赖于bundle X的另一个bundle项目Y的编译类路径时,请查找错误之前以下日志消息中的最后一个:

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

这行显示了哪个项目存在解析问题。


如果出现错误的项目实际上是依赖于另一个包Y的,而Y在其Bundle-RequiredExecutionEnvironment头中声明了JavaSE-1.6的执行环境,则构建失败是合理的。原因是:除非另有配置,否则 Tycho 假定您希望在提供了BREE头中指定的执行环境的OSGi容器中运行包 Y。在此示例中,这将是在JavaSE-1.6 VM 上的OSGi容器。但是,在这样的容器中,Y不能启动,因为它依赖于无法启动的X。这就是Tycho检测到的原因,也是构建失败的原因。

您可以通过以下几种方式解决此问题:

  • 同时更改包Y的 BREE 头。如果您知道 Y 将始终与要求 JavaSE-1.7 的 bundle X 版本一起运行,则特别适用此选项。

  • 独立于 BREE 头通过 executionEnvironment 目标平台配置为包 Y 配置执行环境(不推荐)。这可能会更改包 Y 编译的 JRE,因此包 Y 实际上可能不再在 Java 6 上运行。因此,请仅在完全了解执行环境对构建的影响时才使用此选项。

  • 通过将目标平台配置参数resolveWithExecutionEnvironmentConstraints设置为false(自 Tycho 0.22.0 以来)来禁用 Tycho 对执行环境约束的检查。如果您的包 Y 可能与编译时使用的 bundle X 完全不同的版本或实现一起运行,则这可能是有意义的


如果出现错误的项目实际上是 bundle X 项目本身,则在(父)POM 或 build.properties 中可能存在某些配置,使得 Tycho 使用比 bundle X 的 Bundle-RequiredExecutionEnvironment 头中指定的更低的执行环境(有关详情,请参见执行环境配置文档)。您应该删除这个冲突而多余的配置。


3
谢谢。你对 build.properties 的说明让我检查了一下。我在项目中使用的是 jre.compilation.profile = JavaSE-1.6。将其更改为 JavaSE-1.7 解决了我的问题。 - Jmini

1

谢谢您提供的链接,它包含了解决我的问题的方法。@oberlies 提供的答案更加详细,这就是我选择它的原因。 - Jmini

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接