我已在我的应用程序的清单文件中将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
。通过正确设置JAVA_HOME解决了related problem on the Tycho-Mailing list,但我的问题似乎有所不同。
我在版本0.19.0中使用Tycho。我也尝试过更新的版本,但这并没有改变任何东西。
答案 0 :(得分:6)
仔细查看日志消息 - 您不可能收到错误消息
[ERROR] Bundle X - Missing Constraint: Bundle-RequiredExecutionEnvironment: JavaSE-1.7
而Tycho解析依赖关系和依赖于捆绑X的不同捆绑项目Y的编译类路径。在错误之前找到以下日志消息中的最后一个:
[INFO] Resolving class path of MavenProject: ...
此行显示哪个项目有解决问题。
如果失败的项目实际上是依赖于捆绑X的不同的捆绑Y,则应检查捆绑Y的Bundle-RequiredExecutionEnvironment
标头:如果捆绑Y声明例如一个BREE of JavaSE-1.6,预计构建失败。原因如下:除非另有配置,否则Tycho假定您要在OSGi容器中运行包Y,该容器提供BREE标头中指定的执行环境。在该示例中,这将是JavaSE-1.6 VM上的OSGi容器。但是在这样的容器中,Y无法启动,因为它依赖于无法启动的X.这是Tycho检测到的以及构建失败的原因。
您可以通过不同方式处理这种情况:
同时更改捆绑包Y的BREE标头。如果您知道Y将始终与需要JavaSE-1.7的捆绑X版本一起运行,这尤其有意义。
将捆绑Y的执行环境与BREE标头分开配置,例如:通过executionEnvironment
目标平台配置(不推荐)。这也可能会更改编译包Y的JRE,因此实际上捆绑Y可能不再在Java 6上运行。因此,如果您完全理解implications of the execution environment on the build,则只能使用此选项。
通过将目标平台配置参数resolveWithExecutionEnvironmentConstraints
设置为false
来禁用Tycho对执行环境约束的检查(自Tycho 0.22.0起)。 This may make sense如果您的捆绑包Y可能使用与编译时使用的版本完全不同的捆绑X版本或实现。
如果失败的项目是捆绑X项目本身,则在(父)POM或build.properties中存在一些配置,这使得Tycho使用与Bundle-RequiredExecutionEnvironment
中指定的环境不同的较低执行环境。捆绑X的标头(有关详细信息,请参阅documentation on the execution environment configuration)。您应该删除这种冲突的冗余配置。
答案 1 :(得分:1)
是否可以在pom.xml中配置不同的执行环境(可能从父pom继承)?参见
https://wiki.eclipse.org/Tycho/Execution_Environments#Execution_environment_configuration