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
を要求する新しいプラグインプロジェクトを作成しました。
もちろんmyplugin/META-INF/MANIFEST.MF
ファイルには:
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
製品ファイルでこのプラグインを使用しています。検証しようとすると、次のエラーが表示されます。
もちろん、製品を起動すると、次のようになります:
!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
設定> Java>インストール済みJRE>実行環境
Preferences> Java> Compiler:JDK Compliance Compiler Compliance level
製品を起動するときに、jre8を実行環境として使用するLaunchingタブでチェックインしました。
私はJava Runtime Environment
ダイアログのRun Configurations
を変更しようとしました:
別の設定を試しました。それらのどれも動作しません。
なにが問題ですか?
既知の問題ですか?
このエラーは、バンドルのマニフェストに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"
見る
Bundle-RequiredExecutionEnvironment
( "BREE")JavaSE-1.8
を使用してJUnitプラグインテストを実行するJuno 3.8.2に基づくターゲットプラットフォームの改造に関する私の経験を共有します。
マニフェストに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"
この機能は決して取り上げられませんでした。
クリスチャンの答えに概説されている-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)
org.Eclipse.osgi
バンドルにパッチを適用して、LunaのJavaSE-1.8.profile
を含めます。
ファイル<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
)
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つの欠点を認識しています。
おそらく、PDEはBREEを評価し、それに応じてコンパイラのソースレベルを設定します。その結果、Java 8ソース。 。
Eclipse Tycho を使用すると、バンドルのBREEを評価する代わりに(コンパイルするJDKを選択するために)javacソースレベルを手動でオーバーライドできます。ただし、Tychoも指定されたソースレベルとBREEを一致させ、Java 8コード(Tycho 0.22でテスト済み)のコンパイルを拒否します。
また、アプローチ2はPDEのバンドルエクスポートでは動作しない可能性があります。少なくとも、VM引数を渡す可能性を認識していません。
アプローチ3に進み、ターゲットプラットフォームにパッチを適用して、Java 8とEclipse 3.8を併用しました。
すべての3.8ベースのEclipseプラグインで独自のP2リポジトリを既に維持しているため、次のことが必要でした。
org.Eclipse.osgi
の更新されたコピーを作成します(バンドルから署名情報も削除する必要があります)org.Eclipse.rcp
機能に更新されたorg.Eclipse.osgi
バンドルを適用する機能パッチを作成するEclipse.orgベースの更新サイトを使用する代わりに、独自のP2リポジトリを維持してカスタムターゲットプラットフォームを提供する場合、Eclipse 3.8をJava 8で動作させることができます。
あまり手間をかけずに機能する構成を見つけました。製品ファイル、プロジェクト設定、ビルドパスでJava 8を選択します。重要なのはマニフェストファイルです。ここでJava 8と= Java 7.ここでも順序が重要です。Java 8が先頭になければなりません。
この構成が機能している理由は、コンパイラが最初のJREを選択するため、Java 8.の新しい構文を処理できるためです。Eclipseバンドルは、エントリの1つが必要かどうかをチェックします= Java 7そしてまた満たされます。
簡単な修正方法は、org.Eclipse.equinox.ds(equinox宣言サービス)を含めることです。そのランタイムバンドルは必要なosgi.extenderをエクスポートし、追加の依存関係をトリガーしないように見えます。
実際の迅速なソリューション:
「実行構成の[プラグイン]タブを編集し、org.Eclipse.equinox.dsをチェックして、[追加]をクリックしました必要なプラグイン '。TIT FIXED IT。 "
同じ問題があります:必要な機能がありません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ヘッダーを修正した場合、回避策を得たことを意味します。 (バンドルをオープンリポジトリからインストールする場合、適切なソリューションではありません。)
Liferay dxpでこのエラーが発生しました。 liferayワークスペースを変更しましたが、正常に動作しています。
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
この問題は、私が行ったように、構成に追加のシステム機能を追加した場合にのみ発生します。そのため、この問題を見る人とそうでない人がいる理由を説明できるかもしれません。
パッチを適用しましたが、ファイラーは再び機能しています。