0

ZAPという Java アプリケーションの拡張機能を作成しています。拡張機能は、Equinox バンドル ( )がインライン化された fat/uber jar です。追加のバンドルも、この jar のサブディレクトリ内に含まれています。OSGi フレームワークは、How To Embed OSGiで説明されているように開始されています。org.eclipse.osgibundles

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-PackageEquinox のバンドルで指定された値に設定します

フレームワークが 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 が役に立ちますか?

4

1 に答える 1

0

OK、説明の欠如が原因だったようですMETA-INF/MANIFEST.MF:

  • 削除 ( ) してから、陰影付きの jarを Equinox のマニフェストのコピーにjar uM...更新 ( ) し、番号を vs で終わるように変更しました。jar um...MANIFEST.MFBundle-Version17661700
  • ZAP のクラスパスから Equinox を削除しました

次に、拡張機能をそのままロードしました。GoGo シェルが起動します。

osgi> 13177 [AWT-EventQueue-0] INFO org.parosproxy.paros.control.Control  - New Session
ss
"Framework is launched."


id  State       Bundle
0 ACTIVE      org.eclipse.osgi_3.10.102.v20160118-1766
1 ACTIVE      org.apache.felix.gogo.runtime_0.10.0.v201209301036
2 ACTIVE      org.eclipse.emf.common_2.11.1.v20160208-0816
3 ACTIVE      org.apache.felix.gogo.shell_0.10.0.v201212101605
4 ACTIVE      org.eclipse.equinox.console_1.1.100.v20141023-1406
5 ACTIVE      org.apache.felix.gogo.command_0.10.0.v201209301215
6 ACTIVE      org.eclipse.emf.ecore_2.11.2.v20160208-0816
osgi> 

システム バンドルが同じ変更されたバージョン番号で終了していることがわかるので、追加されMANIFEST.MFた . したがって、根本的な問題は不完全なシステム バンドル マニフェストでした。既存のもの (Equinox のもの) をコピーするだけで十分に機能します。また、直接のコマンドライン テストでも機能します。

$ java -cp semiotics-alpha-1.zap org.eclipse.core.runtime.adaptor.EclipseStarter -console
osgi> exit
Really want to stop Equinox? (y/n; default=y)  y

このアプローチを使用するかどうかはわかりません。少なくとも、このアプローチを使用したい場合に何をする必要があるかはわかっています。

于 2016-05-18T16:01:17.327 に答える