web-dev-qa-db-ja.com

Java 8&必要な機能がありませんRequire-Capability:osgi.ee; filter = "(&(osgi.ee = JavaSE)(version = 1.8))"

Eclipse Luna win32.x86_64 runing with Java 8。

Help Menu > About > Installation Detail > Configuration Tabから:

Java.runtime.version=1.8.0_05-b13
Java.version=1.8.0_05

実行環境としてJavaSE-1.8を要求する新しいプラグインプロジェクトを作成しました。

Plug-in Editor. JavaSE-1.8 as Execution Environment

もちろんmyplugin/META-INF/MANIFEST.MFファイルには:

 Bundle-RequiredExecutionEnvironment: JavaSE-1.8

製品ファイルでこのプラグインを使用しています。検証しようとすると、次のエラーが表示されます。

Validations Dialog, opened from the product file editor

もちろん、製品を起動すると、次のようになります:

!ENTRY org.Eclipse.osgi 2 0 2014-07-10 08:14:22.042
!MESSAGE One or more bundles are not resolved because the following root constraints are not resolved:
!SUBENTRY 1 org.Eclipse.osgi 2 0 2014-07-10 08:14:22.043
!MESSAGE Bundle update@********/myplugin/ was not resolved.
!SUBENTRY 2 myplugin 2 0 2014-07-10 08:14:22.044
!MESSAGE Missing required capability Require-Capability: osgi.ee; filter="(&(osgi.ee=JavaSE)(version=1.8))".

私は多くを検証しようとしました:

設定> Java>インストール済みのJRE

Installed JREs

設定> Java>インストール済みJRE>実行環境

Excution Environments

Preferences> Java> Compiler:JDK Compliance Compiler Compliance level

Compiler

製品を起動するときに、jre8を実行環境として使用するLaunchingタブでチェックインしました。

私はJava Runtime EnvironmentダイアログのRun Configurationsを変更しようとしました:

Java Runtime Environment

別の設定を試しました。それらのどれも動作しません。


なにが問題ですか?

既知の問題ですか?

34
Jmini

このエラーは、バンドルのマニフェストにRequire-Capability: osgi.ee; filter="(&(osgi.ee=JavaSE)(version=1.8))"エントリがあることを意味します。そのため、この機能を提供するバンドルがある場合にのみ、バンドルが開始されます。

Osgi.ee機能の場合、この機能を提供するのはOSGiフレームワーク(equinox)です。どうやらこれはしていません。

そのため、1つのアプローチは、マニフェストをバンドルしてヘッダーを削除することです。もう1つは、分点エクスポート機能を使用することです。おそらく、最新の分点バージョンを試してみてください。これが役立つかどうかはわかりません。フレームワークプロパティを設定することもできます(-Dを使用):org.osgi.framework.system.capabilities = osgi.ee; osgi.ee = "JavaSE"; version:List = "1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8"

見る

21

Bundle-RequiredExecutionEnvironment( "BREE")JavaSE-1.8を使用してJUnitプラグインテストを実行するJuno 3.8.2に基づくターゲットプラットフォームの改造に関する私の経験を共有します。

失敗したアプローチ1:フラグメント

マニフェストにorg.Eclipse.osgiヘッダーを含むProvide-Capabilityへのフラグメントを作成します。

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: FrwJava8Support
Bundle-SymbolicName: frwJava8Support
Bundle-Version: 1.0.0.qualifier
Fragment-Host: org.Eclipse.osgi;bundle-version="3.8.2"
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Provide-Capability: osgi.ee;osgi.ee="JavaSE";version:List="1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8"

この機能は決して取り上げられませんでした。

失敗したアプローチ2:起動パラメーター

クリスチャンの答えに概説されている-Dorg.osgi.framework.system.capabilitiesを使用します。

まず、引数を正しく引用する必要があります。

-Dorg.osgi.framework.system.capabilities="osgi.ee; osgi.ee=\"JavaSE\";version:List=\"1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8\""

このアプローチは、pde.junit以外の他のユースケースでも機能する可能性があります。私はまだこの(わずかに異なる)例外を受け取りました:

!MESSAGE Bundle com.XXX.tst.frw.common_1.0.0.qualifier [92] was not   resolved.
!SUBENTRY 2 com.XXX.tst.frw.common 2 0 2015-04-18 13:43:55.336
!MESSAGE Missing Constraint: Bundle-RequiredExecutionEnvironment: JavaSE-1.8
!SUBENTRY 1 org.Eclipse.osgi 2 0 2015-04-18 13:43:55.336
!MESSAGE Bundle com.XXX.tst.frw.common.test_1.0.0.qualifier [101] was not resolved.
!SUBENTRY 2 com.XXX.tst.frw.common.test 2 0 2015-04-18 13:43:55.336
!MESSAGE Missing Host com.XXX.tst.frw.common_1.0.0.

!ENTRY org.Eclipse.osgi 4 0 2015-04-18 13:43:55.336
!MESSAGE Application error
!STACK 1
Java.lang.IllegalArgumentException: Bundle "com.XXX.tst.frw.common" not found. Possible causes include missing dependencies, too restrictive version ranges, or a non-matching required execution environment.
    at org.Eclipse.pde.internal.junit.runtime.RemotePluginTestRunner.getClassLoader(RemotePluginTestRunner.Java:77)

作業アプローチ3:パッチイクイノックス

org.Eclipse.osgiバンドルにパッチを適用して、LunaのJavaSE-1.8.profileを含めます。

  1. ファイル<LUNA>\plugins\org.Eclipse.osgi_3.10.1.v20140909-1633.jar\JavaSE-1.8.profileをターゲットプラットフォームバンドルプールのorg.Eclipse.osgiバンドルにコピーします。
    (例:<myworkspace>\.metadata\.plugins\org.Eclipse.pde.core\.bundle_pool\plugins\org.Eclipse.osgi_3.8.2.v20130124-134944.jar\JavaSE-1.8.profile

  2. profile.listの参照プロファイル(実際、これはオプションのようです):
    JavaSE-1.8.profile,\.metadata\.plugins\org.Eclipse.pde.core\.bundle_pool\plugins\org.Eclipse.osgi_3.8.2.v20130124-134944.jar\profile.listに追加

ただし、このソリューションでは、org.Eclipse.osgiバンドルを含む独自のP2リポジトリをホストするか、すべてのワークスペースのバンドルプールにパッチを適用する必要があります。

討論

それでも、既存のorg.Eclipse.osgi 3.8.2バージョンと互換性のある「JavaSE-1.7」でBREEを維持する可能性があります。

現在、2つの欠点を認識しています。

  • Java 8構文がコードで使用されている場合(ラムダ式など)、PDEを介してEclipseからプラグインを直接エクスポートできません。
  • ログにはコンパイラエラーが含まれ、コンパイル結果は実際にはJavaSE-1.8 BREEでコンパイルされたバンドルと比較してサイズが異なります。

おそらく、PDEはBREEを評価し、それに応じてコンパイラのソースレベルを設定します。その結果、Java 8ソース。 。

Eclipse Tycho を使用すると、バンドルのBREEを評価する代わりに(コンパイルするJDKを選択するために)javacソースレベルを手動でオーバーライドできます。ただし、Tychoも指定されたソースレベルとBREEを一致させ、Java 8コード(Tycho 0.22でテスト済み)のコンパイルを拒否します。

また、アプローチ2はPDEのバンドルエクスポートでは動作しない可能性があります。少なくとも、VM引数を渡す可能性を認識していません。

2015年5月29日更新

アプローチ3に進み、ターゲットプラットフォームにパッチを適用して、Java 8とEclipse 3.8を併用しました。

すべての3.8ベースのEclipseプラグインで独自のP2リポジトリを既に維持しているため、次のことが必要でした。

  • org.Eclipse.osgiの更新されたコピーを作成します(バンドルから署名情報も削除する必要があります)
  • org.Eclipse.rcp機能に更新されたorg.Eclipse.osgiバンドルを適用する機能パッチを作成する
  • ワークステーションとビルドサーバーが使用する新しい3.8ベースのP2リポジトリを公開します。

概要

Eclipse.orgベースの更新サイトを使用する代わりに、独自のP2リポジトリを維持してカスタムターゲットプラットフォームを提供する場合、Eclipse 3.8をJava 8で動作させることができます。

参照: osgi.eeをサポートするEclipseバグ

17
Henrik Steudel

あまり手間をかけずに機能する構成を見つけました。製品ファイル、プロジェクト設定、ビルドパスでJava 8を選択します。重要なのはマニフェストファイルです。ここでJava 8と= Java 7.ここでも順序が重要です。Java 8が先頭になければなりません。

この構成が機能している理由は、コンパイラが最初のJREを選択するため、Java 8.の新しい構文を処理できるためです。Eclipseバンドルは、エントリの1つが必要かどうかをチェックします= Java 7そしてまた満たされます。

3
stefan

簡単な修正方法は、org.Eclipse.equinox.ds(equinox宣言サービス)を含めることです。そのランタイムバンドルは必要なosgi.extenderをエクスポートし、追加の依存関係をトリガーしないように見えます。

3
andrew glynn

実際の迅速なソリューション:

実行構成の[プラグイン]タブを編集し、org.Eclipse.equinox.dsをチェックして、[追加]をクリックしました必要なプラグイン '。TIT FIXED IT "

https://bugs.Eclipse.org/bugs/show_bug.cgi?id=494913#c2

1
Alejandro Hdz

同じ問題があります:必要な機能がありませんRequire-Capability:osgi.ee; filter = "(&(osgi.ee = JavaSE)(version = 1.8))

Felix 5.6.10を使用しています

ここで私が発見した興味深いことがあります。次のMANIFEST.MFを含む2つのtest.jarバンドルを作成しました

test1.jar Manifest-Version:1.0 Bundle-Description:テストに使用されるバンドルBundle-SymbolicName:com.phinneyridge.testbundle Bundle-Version:0.0.1 Bundle-Name:testbundle Bundle-ManifestVersion:2 Require-Capability:osgi.ee = JavaSE; version = "1.8"作成者:1.8.0_131(Oracle Corporation)

test2.jar:Manifest-Version:1.0 Bundle-Description:テストに使用されるバンドルBundle-SymbolicName:com.phinneyridge.testbundle Bundle-Version:0.0.2 Bundle-Name:testbundle Bundle-ManifestVersion:2 Require-Capability:osgi.ee ; filter:= "(&(osgi.ee = JavaSE)(version 1.8))"作成者:1.8.0_131(Oracle Corporation)

ご覧のとおり、2つのバンドルはBundle-Versionと必要な機能の指定方法のみが異なります。

結果は次のとおりです。test1.jarをインストールすると、test2.jarをインストールしようとすると、不足している要件メッセージが生成されます。

したがって、felix osgiフレームワークでは機能しないRequire-Capabilityヘッダーでフィルターを使用することについて何かがあります。サポートされていませんが、フィルターを有効にするために構成する必要があるものはありますか?私のフレームワークが必要なosgi.ee機能を持つように構成されていないからではありません(test1.jarは機能します)。

明らかに、それは障害のあるバンドルのRequire-Capabilityヘッダーを修正した場合、回避策を得たことを意味します。 (バンドルをオープンリポジトリからインストールする場合、適切なソリューションではありません。)

0
tom

Liferay dxpでこのエラーが発生しました。 liferayワークスペースを変更しましたが、正常に動作しています。

0
Tushar Patel

Felix 5.6.10バージョンで問題を引き起こしている問題を見つけました。

「必要な機能がありませんRequire-Capability:osgi.ee; filter = "(&(osgi.ee = JavaSE)(version = 1.8))"

これが問題を引き起こすコードです。 ExtensionManagerのコンストラクターにあります

String pkgextra =
        "true".equalsIgnoreCase(configProps.getProperty(FelixConstants.USE_PROPERTY_SUBSTITUTION_IN_SYSTEMPACKAGES)) ?
            Util.getPropertyWithSubs(configProps, FelixConstants.FRAMEWORK_SYSTEMPACKAGES_EXTRA) :
            configProps.getProperty(FelixConstants.FRAMEWORK_SYSTEMPACKAGES_EXTRA);
    syspkgs = ((pkgextra == null) || (pkgextra.trim().length() == 0))
        ? syspkgs : syspkgs + (pkgextra.trim().startsWith(",") ? pkgextra : "," + pkgextra);

最後の行を次のように変更しました:

    syspkgs = ((pkgextra == null) || (pkgextra.trim().length() == 0))
        ? syspkgs : syspkgs + (pkgextra.trim().startsWith(",") ? pkgextra.substring(1) : pkgextra);

それが問題を引き起こす理由は、コンストラクターの少し先でこのコードを見つけることです:

try
{
    ManifestParser mp = new ManifestParser(
        m_logger, m_configMap, m_systemBundleRevision, m_headerMap);
    List<BundleCapability> caps = aliasSymbolicName(mp.getCapabilities());
    caps.add(buildNativeCapabilites());
    appendCapabilities(caps);
}
catch (Exception ex)
{

修正なしでは、ManifestParserコンストラクター呼び出しは、エクスポートされた機能を空白にすることはできないという文句を言う例外をスローします。 syspkgsの余分なコンマにより、パーサーは一部の機能が欠落していると考えました。

そして、その試行ブロックに失敗すると、フレームワークにHost osgi.ee機能が追加されないため、(&(osgi.ee = JavaSE)(version = 1.8))のようなリクエストを解決できません。

明確にするために、これは私が言及している特定のバージョンです。

org.Apache.felix:org.Apache.felix.framework:5.6.10

この問題は、私が行ったように、構成に追加のシステム機能を追加した場合にのみ発生します。そのため、この問題を見る人とそうでない人がいる理由を説明できるかもしれません。

パッチを適用しましたが、ファイラーは再び機能しています。

0
tom