ZAPという Java アプリケーションの拡張機能を作成しています。拡張機能は、Equinox バンドル ( )がインライン化された fat/uber jar です。追加のバンドルも、この jar のサブディレクトリ内に含まれています。OSGi フレームワークは、How To Embed OSGiで説明されているように開始されています。org.eclipse.osgi
bundles
Eclipse の「コンソール シェル」ドキュメントで概説されている手順に従って、Felix GoGo シェルを機能させようとしています。次の必須バンドルを指定します。
org.apache.felix.gogo.command
org.apache.felix.gogo.runtime
org.apache.felix.gogo.shell
org.eclipse.equinox.console
Equinox / に加えてorg.eclipse.osgi
。Equinox はクラスパス上にないため、org.osgi.framework.system.packages.extra
構成をExport-Package
Equinox のバンドルで指定された値に設定します。
フレームワークが ACTIVE 状態になると、Eclipse で (または Eclipse の外部のコマンド ラインを介して) 次のスタック トレースが表示されます。
Starting OSGi framework...
OSGi framework state: 32
gogo: MalformedURLException: unknown protocol: bundleresource
java.net.MalformedURLException: unknown protocol: bundleresource
at java.net.URL.<init>(URL.java:593)
at java.net.URL.<init>(URL.java:483)
at java.net.URL.<init>(URL.java:432)
at java.net.URI.toURL(URI.java:1089)
at org.apache.felix.gogo.shell.Shell.readScript(Shell.java:209)
at org.apache.felix.gogo.shell.Shell.source(Shell.java:192)
at org.apache.felix.gogo.shell.Shell.gosh(Shell.java:109)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.apache.felix.gogo.runtime.Reflective.invoke(Reflective.java:137)
at org.apache.felix.gogo.runtime.CommandProxy.execute(CommandProxy.java:82)
at org.apache.felix.gogo.runtime.Closure.executeCmd(Closure.java:477)
at org.apache.felix.gogo.runtime.Closure.executeStatement(Closure.java:403)
at org.apache.felix.gogo.runtime.Pipe.run(Pipe.java:108)
at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:183)
at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:120)
at org.apache.felix.gogo.runtime.CommandSessionImpl.execute(CommandSessionImpl.java:89)
at org.apache.felix.gogo.shell.Activator.run(Activator.java:75)
at java.lang.Thread.run(Thread.java:745)
Equinox URL ハンドラが GoGo で使用されていないようです。それらに関連する次のパッケージが Equinox の にないことに気付きましたExport-Package
:
org.eclipse.osgi.storage.url
org.eclipse.osgi.storage.url.bundleresource
org.eclipse.osgi.storage.url.bundleentry
そのため、それらもorg.osgi.framework.system.packages.extra
パッケージリストに含めました。それは役に立ちませんでした。
それ以外の場合、明らかなエラーなしでバンドルがインストールおよび開始されます。
GoGo で Equinox のカスタム URL ハンドラを利用するにはどうすればよいですか?
更新 1: 多分レッドニシン
ランダムなトラブルシューティングでは、ここで概説されているように、最終的なシェーディング jar を実行したいと考えていました。org.eclipse.osgi
元のバンドルと影付きの jar の両方を同じディレクトリにコピーしました。ロードするconfiguration/config.ini
バンドルを指定しています。
ストック バンドルを実行すると、コンソールが表示されます。
$ java -cp ~/.p2/pool/plugins/org.eclipse.osgi_3.11.0.v20160121-2005.jar org.eclipse.core.runtime.adaptor.EclipseStarter -console
osgi> ss
"Framework is launched."
id State Bundle
0 ACTIVE org.eclipse.osgi_3.11.0.v20160121-2005
1 ACTIVE org.apache.felix.gogo.runtime_0.10.0.v201209301036
2 ACTIVE org.apache.felix.gogo.command_0.10.0.v201209301215
3 ACTIVE org.apache.felix.gogo.shell_0.10.0.v201212101605
4 ACTIVE org.eclipse.equinox.console_1.1.200.v20150929-1405
osgi> exit
Really want to stop Equinox? (y/n; default=y)
影付きの jar を実行しますが、それほど多くはありません。
java -cp semiotics-alpha-1.zap org.eclipse.core.runtime.adaptor.EclipseStarter -console
java.lang.NullPointerException: A null service reference is not allowed.
at org.eclipse.osgi.internal.framework.BundleContextImpl.getService(BundleContextImpl.java:617)
at org.eclipse.core.runtime.adaptor.EclipseStarter.startup(EclipseStarter.java:299)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:231)
at org.eclipse.core.runtime.adaptor.EclipseStarter.main(EclipseStarter.java:208)
これは完全なニシンかもしれません... 私は OSGi について非常に無知です。これは私の最初の実践的な経験です。ただし、シェーディングされた jar は、在庫の Equinox jar と同じように実行されると思います。なぜ違いがあるのか わからないので、掘るのに適した場所がないのでそこを掘るつもりです...
更新 2: クラスパス上の Equinox の回避策の問題
Equinox バンドルをディレクトリ経由で ZAP のクラスパスに追加lib
し、拡張 jar にインライン化されないようにしました。これをServiceLoader.load
実行し、クラス ローダーを含めないように呼び出しを調整すると (システム クラス ローダーがデフォルトになります)、次のように動作します。
Starting bundle: org.apache.felix.gogo.shell_0.10.0.v201212101605 [1]
Starting bundle: org.eclipse.equinox.console_1.1.100.v20141023-1406 [2]
Starting bundle: org.apache.felix.gogo.command_0.10.0.v201209301215 [3]
Starting bundle: org.eclipse.emf.ecore_2.11.2.v20160208-0816 [4]
Starting bundle: org.eclipse.emf.common_2.11.1.v20160208-0816 [5]
Starting bundle: org.apache.felix.gogo.runtime_0.10.0.v201209301036 [6]
osgi> ss
"Framework is launched."
id State Bundle
0 ACTIVE org.eclipse.osgi_3.11.0.v20160121-2005
1 ACTIVE org.apache.felix.gogo.shell_0.10.0.v201212101605
2 ACTIVE org.eclipse.equinox.console_1.1.100.v20141023-1406
3 ACTIVE org.apache.felix.gogo.command_0.10.0.v201209301215
4 ACTIVE org.eclipse.emf.ecore_2.11.2.v20160208-0816
5 ACTIVE org.eclipse.emf.common_2.11.1.v20160208-0816
6 ACTIVE org.apache.felix.gogo.runtime_0.10.0.v201209301036
osgi>
根本的な問題は、おそらくファイルに関連して、jar がどのようにインライン化されているかである可能性がありMANIFEST.MF
ます。関連している可能性がありますが、 の値を指定する必要がなくなりましたorg.osgi.framework.system.packages.extra
。
OSGi ライブラリをシェーディング アーティファクトとして含めることが本来の目的だったので、この質問には答えないままにしておきます。たぶん bndtools が役に立ちますか?