2016-05-24 9 views
1

Ich verwende maven-bundle-plugin (bnd effektiv).Wie man eine Ressourcendatei in das OSGI-Bundle aus der Jar-Abhängigkeit mit dem bnd/maven-bundle-plugin einbindet?

Es ist einfach, eine Ressourcendatei aus Quellen einzuschließen.

Zum Beispiel wird eine Ressourcendatei (src/main/resources/some.xml) bewegt wird unter target Verzeichnis (target/classes/some.xml) während der Aufbauzeit und kann in das Bündel mit <Include-Resource> Befehl enthalten sein:

<plugin> 
    <groupId>org.apache.felix</groupId> 
    <artifactId>maven-bundle-plugin</artifactId> 
    <version>3.0.1</version> 
    <extensions>true</extensions> 
    <configuration> 
     <instructions> 
      <Include-Resource> 
       some.xml=target/classes/some.xml, 
      </Include-Resource> 
     </instructions> 
    </configuration> 
</plugin> 

Lassen Sie uns eine Abhängigkeit haben:

Wie Referenz Ressource Datei innerhalb abhängig jar Referenz?

Mit anderen Worten, wie man

  • etwas wie folgt angeben:

    com.example:library:1.0.0:jar/some.xml 
    
  • statt dessen:

    target/classes/some.xml 
    

so dass Ressource von einem von die Abhängigkeit erschien im Ausgabebündel jar?

+0

Ich verstehe die Frage nicht. Fragen Sie, wie Sie zur Laufzeit aus Code innerhalb des Bundles auf some.xml verweisen können? –

+0

Ich möchte nur bündeln 'jar' mit' some.xml' aus einem anderen (Abhängigkeit) 'jar' genommen. Letztendlich wird dies durch Code referenziert, aber bevor es durch Code referenziert werden kann, sollte es in die Ausgabe "jar" gepackt werden. – uvsmtid

Antwort

1

Sie können die maven-depencency-plugin verwenden, um Ihr abhängiges Glas zu dekomprimieren und dann die Ressource in Ihr Glas zu integrieren.

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <executions> 
     <execution> 
      <id>unpack-dependencies</id> 
      <phase>generate-resources</phase> 
      <goals> 
       <goal>unpack</goal> 
      </goals> 
      <configuration> 
       <markersDirectory>${project.build.directory}/dependencies/dependency-maven-plugin-markers</markersDirectory> 
       <artifactItems> 
        <artifactItem> 
         <groupId>DEPENDENCY_GROUPID</groupId> 
         <artifactId>DEPENDENCY_ARTIFACTID</artifactId> 
         <type>OPTIONAL_DEPENCENCY_TYPE</type> 
         <outputDirectory>${project.build.directory}/dependencies/DEPENDENCY_ARTIFACTID</outputDirectory> 
        </artifactItem> 
       </artifactItems> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 
... 
<plugin> 
    <groupId>org.apache.felix</groupId> 
    <artifactId>maven-bundle-plugin</artifactId> 
    <configuration> 
     ... 
     <instructions> 
      ... 
      <Include-Resource>target/dependencies/DEPENDENCY_ARTIFACTID/some.xml</Bundle-Activator> 
     </instructions> 
    </configuration> 
</plugin> 

Die Include-Resource Anweisungen soll pom relativ sein, siehe Include-Resource, werden Sie wahrscheinlich target mit ${project.build.directory} ersetzen kann.

+0

Ehrlich gesagt, erwartete ich, dass es einen Trick von 'maven-bundle-plugin' /' bnd' geben könnte, um Ressourcen in Ausgabebündel 'jar' zu verschieben, ähnlich wie das Plugin, wenn' Private-Package' Anweisung mit Paketen angegeben wird (und diese Pakete werden Teil des Ausgabebündels "jar". Diese Antwort ist jedoch einfach und geht um, indem man einige Verantwortlichkeiten von der Verfeinerung von "maven-bundle-plugin" abschneidet. – uvsmtid

2

Wenn Sie eine Datei Verweis auf das Glas haben, können Sie tun

-includeresource: @path/to/file.jar!/some.xml

Sie verwenden den @ Präfix die Ressource zu sagen, in dem Glas ist und die !/ Syntax aus Glas Urls.

Der schwierige Teil wird einen Pfad zum Jar aus den Projektabhängigkeiten erhalten, die ich vermute.

+0

In der Tat. Ich weiß nicht, wie man zuverlässig auf die Kopie der 'jar'-Datei verweist, die als Maven-Abhängigkeit aufgelistet ist.Also, die Antwort mit 'maven-dependency-plugin' war akzeptabel und behob das Problem vorerst. Allerdings könnte ich Ihre Information auch brauchen - upvoting. Vielen Dank! – uvsmtid

+0

Für weitere Informationen können Sie einen Pfad zu einem Jar mit dem (ich denke undokumentiert) 'Repo'-Makro, zB: ' -includersresource: @ $ {Repo; org.apache.felix.http; neuesten}!/META -INF/LICENSE' Sie können sogar so etwas tun (aber nicht im cnf-Projekt, da die Repos noch nicht definiert sind): '-include: jar: $ {fileuri; $ {repo; bsn; version}}!/resource.properties' –

+0

Bei dieser Frage geht es um einen Maven-Build, also ist es kein bnd-Workspace und daher ist es unwahrscheinlich, dass Repos für das Repo-Makro konfiguriert sind, um irgendeinen Nutzen zu haben. –