2017-12-04 3 views
1

OSGiベースのアプリケーションに正常なシャットダウンフックを実装しようとしています。ランチャーソースに直接アクセスできないため、バンドルに実装しています。メソッドにパラメータがある場合、OSGi @Activateはブレークします。エラー:メソッドを検出できません。コンポーネントが失敗する

/** 
* Shutdown Hook for OSGi 
* Based On: https://stackoverflow.com/a/32216407/5284104 
*/ 
@Component() 
public class ShutdownHookActivator{ 

    @Activate 
    public void start(ComponentContext cc, BundleContext bc, Map<String,Object> config) { 
     Thread hook = new Thread() { 
      @Override 
      public void run() { 
       System.out.println("Stopping OSGi Framework."); 
      try { 
       Framework systemBundle = bc.getBundle(0).adapt(Framework.class); 
       systemBundle.stop(); 
       System.out.println("Waiting up to 2s for OSGi shutdown to complete..."); 
       systemBundle.waitForStop(2000); 
      } catch (Exception e) { 
       System.err.println("Failed to cleanly shutdown OSGi Framework: " + e.getMessage()); 
        e.printStackTrace(); 
       } 
      } 
     }; 

     System.out.println("Installing shutdown hook."); 
     Runtime.getRuntime().addShutdownHook(hook); 
    } 
} 

しかし、私はそれを起動するたびに、エラーが返されます:ここで

はクラスがある

ERROR: [ShutdownHookActivator(8)] activate method [start] not found; Component will fail

をしかし、私は開始メソッドからパラメータを削除すると、その後すべての作品。ですから、私は混乱しています。@ActivateメソッドがOSGiフレームワーク(http://enroute.osgi.org/services/org.osgi.service.component.html)によって自動注入されるパラメータを持っていて、これがうまくいくとわかっているので、ただ空の他の例を見てきました。 (OSGiのように感じるのは運が大好きです)

DSアノテーションを使用してFramework BundleContextを取得する適切な方法は何ですか?それも可能ですか?

EDIT: のOSGi環境: BndTools(?aQuteランチャー) ApacheのフェリックスSCR 2.0.12(OSGiのDS注釈 - 6.0.1)が ソースはここで見ることができます:https://github.com/Jafre13/ISS-Product

EDIT 2: 自動生成ShutdownHookActivator.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.3.0" name="dk.sdu.sso.sred.utils.ShutdownHookActivator" activate="start"> 
    <implementation class="dk.sdu.sso.sred.utils.ShutdownHookActivator"/> 
</scr:component> 

マニフェスト:

Manifest-Version: 1.0 
Bnd-LastModified: 1512410080758 
Bundle-ManifestVersion: 2 
Bundle-Name: dk.sdu.sso.sred 
Bundle-SymbolicName: dk.sdu.sso.sred 
Bundle-Version: 0.0.0.201712041754 
Created-By: 1.8.0_151 (Oracle Corporation) 
Import-Package: javax.security.auth.x500,junit.framework,org.junit,org 
.xml.sax,org.xml.sax.ext,org.xml.sax.helpers 
Private-Package: dk.sdu.sso.sred.cmd,dk.sdu.sso.sred.lingpipe,dk.sdu.s 
so.sred.api;version="1.0.0",dk.sdu.sso.sred,com.aliasi.test.unit.xml, 
com.aliasi.test.unit.io,com.aliasi.suffixarray,com.aliasi.test.unit.u 
til,com.aliasi.test.unit.crf,com.aliasi.matrix,com.aliasi.test.unit.s 
entences,com.aliasi.test.unit,com.aliasi.tag,com.aliasi.test.unit.hmm 
,com.aliasi.chunk,com.aliasi.coref,com.aliasi.spell,com.aliasi.test.u 
nit.chunk,com.aliasi.test.unit.features,com.aliasi.coref.matchers,com 
.aliasi.lm,com.aliasi.test.unit.coref,com.aliasi.cluster,com.aliasi.f 
eatures,com.aliasi.test.unit.symbol,com.aliasi.io,com.aliasi.test.uni 
t.tokenizer,com.aliasi.sentences,com.aliasi.test.unit.coref.matchers, 
com.aliasi.test.unit.spell,com.aliasi.test.unit.corpus,com.aliasi.uti 
l,com.aliasi.dca,com.aliasi.symbol,com.aliasi.test.unit.lm,com.aliasi 
.dict,com.aliasi.test.unit.tag,com.aliasi.corpus,com.aliasi.classify, 
com.aliasi.test.unit.dca,com.aliasi.tokenizer,com.aliasi.test.unit.cl 
assify,com.aliasi.crf,com.aliasi.test.unit.cluster,com.aliasi.stats,c 
om.aliasi.test.unit.stats,com.aliasi.test.unit.dict,com.aliasi.test.u 
nit.matrix,com.aliasi.test.unit.suffixarray,com.aliasi.xml,com.aliasi 
.hmm,dk.sdu.sso.sred.utils,org.apache.felix.service.command,org.osgi. 
framework;version="1.8",org.osgi.service.component;version="1.3" 
Provide-Capability: osgi.service;objectClass:List<String>="dk.sdu.sso. 
sred.api.SRedAPI",osgi.service;objectClass:List<String>="dk.sdu.sso.s 
red.cmd.ModelCommands",osgi.service;objectClass:List<String>="dk.sdu. 
sso.sred.cmd.SRedCommands" 
Require-Capability: osgi.extender;filter:="(&(osgi.extender=osgi.compo 
nent)(version>=1.3.0)(!(version>=2.0.0)))",osgi.ee;filter:="(&(osgi.e 
e=JavaSE)(version=1.8))" 
Service-Component: OSGI-INF/dk.sdu.sso.sred.SRed.xml,OSGI-INF/dk.sdu.s 
so.sred.cmd.ModelCommands.xml,OSGI-INF/dk.sdu.sso.sred.cmd.SRedComman 
ds.xml,OSGI-INF/dk.sdu.sso.sred.utils.ShutdownHookActivator.xml 
Tool: Bnd-3.5.0.201709291849 
+0

ビルド時にどのバージョンのDS仕様を使用しますか?実行時に使用するscrのバージョンは何ですか? –

+0

@ChristianSchneider DS仕様は6.0.1です。 SCRランタイムは2.0.12です。 –

+0

それはかなり古いですので、私は古いバージョンから生じる問題は期待していません。おそらく、すべてのパラメータが同時にサポートされているとは限りません。 –

答えて

3

マニフェストから、なぜあなたの問題が発生するのかが明らかです。プライベート・パッケージとしてOSGi APIがあります。これは、クラスがjarファイルに埋め込まれているため、フレームワークとDSで使用されるspecクラスと互換性がないことを意味します。

解決策は、実際に埋め込む必要があるものにのみ専用パッケージを使用することです。 OSGi APIパッケージには絶対に使用しないでください。彼らが働くためには、インポートが必要です。

+0

同じ結果が得られます。それでも "ERROR:[ShutdownHookActivator(20)]メソッドを起動する[スタート]が見つかりません;コンポーネントは失敗します"と表示されます。すべてのパラメータを削除するまでは常に失敗しますが、動作しますが、Framework BundleContextにアクセスできません。 –

+0

あなたのコンポーネント用に生成されたマニフェスト(特にインポート)とxmlを投稿できますか(それはjarファイル内にあります)? –

+0

メインポストを更新しました。私は、JARファイルを生成する際にstart(BundleContext bc)を使用していました。 –

関連する問題