2009-07-27 3 views
2

Ich entwickle meine Anwendung als eine Reihe von OSGi-Bundles mit Maven 2. Einige gängige Funktionen wie Logging, Webserver usw. werden von anderen OSGi-Bundles verwendet, zum Beispiel verwende ich die OSGi-Version von Jetty.Wie bündle ich mehrere Module und 3rd-Party-JARs in einem ZIP mit Maven2?

Ich möchte meine Anwendung mit allen Drittanbieter-Bundles und einem OSGi-Container enthalten. Ich wählte Apache Felix als meinen Standardbehälter.

Ich bin ziemlich neu zu Maven und ich weiß nicht, wie man die POM-Datei schreibt, die dies tut und konnte kein ähnliches Beispiel in der Maven book finden. Der Kernpunkt scheint zu sein, dass ein Projekt mit mehreren Modulen kein eigenes Artefakt erzeugt.

Es erstellt und verpackt meine Bundles in OSGI-kompatiblen JAR-Dateien, wie es sollte (unter Verwendung der maven-bundle-plugin). Jetzt möchte ich es den anderen Sachen auch einpacken (was nicht gebaut oder etwas zu werden braucht, gerade eingezogen und in das Paket legen) und eine ZIP-Datei wie folgt erzeugen:

+-Archive Root 
| 
+- /bundles 
    | 
    +- my.bundle1.jar 
    +- my.bundle2.jar 
    +- 3rd.party.bundle1.jar 
    +- 3rd.party.bundle2.jar 
+- /conf 
    | 
    +- ... some config files ... 
+- felix.jar 

Auf diese Weise kann mein Benutzer die ZIP-Datei herunterladen, entpacken sie es in ein Verzeichnis, sagen sie „MyApp“, und dann

# > java -jar /path/to/MyApp/felix.jar 

einige Noten auf Details gehen, wenn sie Materie:

  • Jedes Bündel ist ein Kind eines gemeinsamen übergeordneten Projekts, das keinen eigenen Quellcode hat und eine packaging auf "pom" eingestellt, wie aus den Beispielen des Buches entnommen.
  • Ich habe mich gegen das Einbetten von Felix in ein zentrales Bundle entschieden ("gehosteter Rahmen" -Ansatz)
  • Ich könnte einen alternativen Versand anbieten, der nur meine eigenen Bündel für Kunden einschließt, die OSGi Behälter laufen lassen. Dies könnte ein Ausgangspunkt sein?

Antwort

2

Ich brauchte eine Weile (etwa einen halben Tag von doc Lesung) zu erkennen, dass die recht einfache Antwort, die ich war auf der Suche war:

Verwenden Sie Maven Assemblies.

Sie können tatsächlich alle Arten von Archiven aus den Artefakten und Abhängigkeiten Ihres Projekts zusammenstellen.

+0

Der Link scheint unterbrochen zu sein –

2

Im doc Sie verweisen, gibt es einen Abschnitt Einbetten von Abhängigkeiten betitelte das beschreibt, wie das Plugin die Maven Projektabhängigkeiten und fügen Sie sie in dem Classpath und Ressourcen löst.

Das Plugin verwendet den Befehl, um die Abhängigkeiten des Projekts in und -Klauseln umzuwandeln, die dann an den aktuellen Befehlssatz angehängt und an BND übergeben werden. Wenn Sie möchten, dass die eingebetteten Abhängigkeiten am Anfang oder in der Mitte von oder dann stehen, können Sie {maven-dependencies} verwenden, was automatisch zu den relevanten Klauseln erweitert wird.

...

Das Plugin verwendet den Befehl die Projektabhängigkeiten in Klauseln und zu transformieren, der auf den aktuellen Satz von Anweisungen dann angehängt werden und auf BND weitergegeben. Wenn Sie möchten, dass die eingebetteten Abhängigkeiten am Anfang oder in der Mitte von oder dann stehen, können Sie {maven-dependencies} verwenden, was automatisch zu den relevanten Klauseln erweitert wird.

Im Beispiel unter den {Maven-Abhängigkeiten} Platzhalter werden die Projektabhängigkeiten werden erweitert, um die Rahmen-Laufzeit sind oder kompilieren in die Include-Ressource und Bundle-Classpath-Elemente.

<!-- embed all compile and runtime scope dependencies --> 
<Embed-Dependency>*;scope=compile|runtime</Embed-Dependency> 

<Include-Resource> 
    {maven-resources},{maven-dependencies} 
</Include-Resource> 

<Bundle-ClassPath>.,{maven-dependencies},some.jar</Bundle-ClassPath> 

Normalerweise wird das Plugin prüft nur direkte Abhängigkeiten, aber dies kann geändert werden die vollständige Liste von transitiven Abhängigkeiten mit der folgenden Option enthalten:

<Embed-Transitive>true</Embed-Transitive> 

Wenn Sie eine Abhängigkeit wollen anstelle von eingebetteten Add inlined die Inline = wahr. Zum Beispiel alle Kompilierung und Laufzeit scoped Abhängigkeiten Inline verwenden:

<Embed-Dependency>*;scope=compile|runtime;inline=true</Embed-Dependency> 
+0

Danke, reich. Dies ist eine eng verwandte Angelegenheit, die auch für meine Frage relevant ist, obwohl sie nicht genau das ist, wonach ich gesucht habe, da sie nur mit dem in Betracht gezogen wird, was in ein einzelnes Bündel fällt. –

Verwandte Themen