2017-06-27 3 views
0

Ich arbeite an einer Hello World-Anwendung. Meine Anwendung wird mit Maven (3.5.0) erstellt, verwendet Apache Felix Annotationen und wird in Apache Karaf (4.1.1) ausgeführt. Meine Anwendung besteht aus einer einzigen Komponente namens App, die sofort gestartet werden sollte. Das Paket wird erfolgreich erstellt. Ich kann es erfolgreich in Karaf von meinem MVN-Repository installieren. Karaf zeigt das Bündel als "Aktiv" an. Das Problem ist, dass Konstruktor und die Methode activate meiner Komponente (App) niemals aufgerufen werden. Ich brauche ein zweites Paar Augen, um mir zu helfen herauszufinden, warum das passiert. Was fehlt mir in meiner pom.xml?OSGI-Paket aktiviert, aber Komponente nie erstellt, wenn DS und Apache Karaf

Der Vollständigkeit halber habe ich in meinem Projekt eine Activator-Klasse erstellt, die BundleActivator implementiert. Ich wies Maven dann an, meinen Bündel-Aktivator auf diese neue Klasse zu setzen. Jetzt, wenn ich mein Paket in Karaf installiere, kann ich die Log-Ausgabe meines Activators sehen. Die Startmethode wird getroffen. Also weiß ich, dass mein Bündel tatsächlich beginnt. Ich verstehe einfach nicht, warum meine App-Komponente niemals erstellt und aktiviert wird.

Hier sind die relevanten Dateien.

App.java

package myCompany; 

import org.apache.felix.scr.annotations.Activate; 
import org.apache.felix.scr.annotations.Component; 

@Component(immediate=true) 
public class App 
{ 
    public App() 
    { 
     System.out.println("App constructed"); 
    } 

    @Activate 
    public void activate() 
    { 
     System.out.println("App activated"); 
    } 
} 

Activator.java

package myCompany; 

import org.osgi.framework.BundleActivator; 
import org.osgi.framework.BundleContext; 

public class Activator implements BundleActivator{ 

    public void start(BundleContext context) throws Exception { 
     System.out.println("Activator started"); 
    } 

    public void stop(BundleContext context) throws Exception { 
     System.out.println("Activator stopped"); 
    } 
} 

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>myCompany</groupId> 
    <artifactId>myProject</artifactId> 
    <packaging>bundle</packaging> 
    <version>1.0-SNAPSHOT</version> 
    <name>myProject</name> 

    <dependencies> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>3.8.1</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.osgi</groupId> 
      <artifactId>org.osgi.core</artifactId> 
      <version>6.0.0</version> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.felix</groupId> 
      <artifactId>org.apache.felix.scr.annotations</artifactId> 
      <version>1.9.6</version> 
      <scope>provided</scope> 
     </dependency> 
    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.felix</groupId> 
       <artifactId>maven-scr-plugin</artifactId> 
       <version>1.24.0</version> 
       <executions> 
        <execution> 
         <id>generate-scr-scrdescriptor</id> 
         <goals> 
          <goal>scr</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.felix</groupId> 
       <artifactId>maven-bundle-plugin</artifactId> 
       <extensions>true</extensions> 
       <version>3.3.0</version> 
       <configuration> 
        <instructions> 
         <_dsannotations>*</_dsannotations> 
         <_metatypeannotations>*</_metatypeannotations> 
         <Bundle-Activator>myCompany.Activator</Bundle-Activator> 
        </instructions> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 

    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 
</project> 

Antwort

2

Karaf nicht suppor enthalten t für deklarative Dienste out-of-the-box. Sie müssen die scr-Funktion installieren DS-Unterstützung zu aktivieren:

feature:install scr 
+0

Das hat funktioniert. Mit meinem Bundle bereits in Karaf geladen (aber nichts tun) Ich lief Feature: install scr, und voila, sehe ich endlich meine "App gebaut" und "App aktiviert" Nachrichten Pop-up. Vielen Dank. – jonathan

1

Sie veraltete Anmerkungen aus dem org.apache.felix.scr.annotations Paket verwenden, die von BND nicht erkannt werden oder verarbeitet werden - sie benötigen eine zusätzliche Maven Plugin zu arbeiten.

Es wäre besser, Ihren Code zu migrieren, um die OSGi-Standardanmerkungen aus dem -Paket zu verwenden. Siehe OSGi Compendium Release 6 Spezifikation, Abschnitt 112.8.

+0

Christian Schneider stellte meine sofortige Lösung unten zur Verfügung. Ich habe eigentlich mit Standard-OSGI-Annotationen begonnen, hatte aber Probleme, mein Bundle korrekt zu generieren, also wechselte ich zu dem, was ich gut kenne, Felix SCR-Annotationen. Nun, da ich die Felix SCR-Annotations funktioniere, werde ich die Standard-OSGI-Annotationen erneut lesen. – jonathan

Verwandte Themen