2017-10-02 4 views
0

Ich brauche eine der Apache-Bibliotheken (axis-jaxrpc) in meinem OSGi-Bundle, aber es ist irgendwie defekt, da sein Jar eine Klasse von Java-Einbauten enthält (javax.xml.namespace.QName). Ich kann es nicht durch irgendeine andere Alternative ersetzen - es ist eine Seitenabhängigkeit für eine andere Abhängigkeit für ...... du weißt wie das geht :)Maven-Bundle-Plugin eingebettete Deps Dateien oder Pakete ausschließen

Das Problem ist, dass immer wenn ich das Paket bündle und es fange es beginnt ganz gut. Aber wenn ich irgendeine Funktionalität in Bezug auf jaxrpc berühre, erhalte ich einen LinkageError, der behauptet, dass QName bereits von <bootloader> geladen worden ist.

Ich habe es geschafft, jaxrpc jar in mein Bundle jar explodieren und javax.namespace Verzeichnis manuell entfernen (d. H. Bearbeiten Sie den Bundle jar Inhalt) vor dem Start der App. Das hat den Trick gemacht - ich bekomme den LinkageError nicht mehr.

Jetzt ist die Frage ... Wie gehe ich mit dieser Situation auf eine nicht-sado-maso Weise um und schließe die verletzende Klasse/das Paket von der eingebetteten jar Datei aus?

POM-Schnipsel:

Abhängigkeiten:

<dependency> 
    <groupId>org.apache.axis</groupId> 
    <artifactId>axis</artifactId> 
    <version>1.4</version> 
    <scope>provided</scope> 
</dependency> 
<dependency> 
    <groupId>org.apache.axis</groupId> 
    <artifactId>axis-jaxrpc</artifactId> 
    <version>1.4</version> 
    <scope>provided</scope> 
</dependency> 

Bundle-Plugin:

<plugin> 
      <groupId>org.apache.felix</groupId> 
      <artifactId>maven-bundle-plugin</artifactId> 
      <version>2.3.6</version> 
      <extensions>true</extensions> 
      <configuration> 
       <instructions> 
        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName> 
        <Export-Package> 
         /* application packages only */ 
        </Export-Package> 
        <Private-Package> 
         /* application packages only */ 
        </Private-Package> 
        <DynamicImport-Package> 
         * 
        </DynamicImport-Package> 
        <Import-Package></Import-Package> 
        <Include-Resource> 
         {maven-resources},target/classes/rebel.xml 
        </Include-Resource> 
        <Embed-Dependency> 
         /* other dependencies */ 
         axis, 
         axis-jaxrpc;inline=true, 
         commons-discovery, 
         commons-logging 
        </Embed-Dependency> 
       </instructions> 
      </configuration> 
     </plugin> 

... umformulieren Gibt es eine Möglichkeit smth wie dies zu tun:

<Embed-Dependency> 
    axis-jaxrpc;inline=true;exclude=javax.namespace.QName 
</Embed-Dependency> 

EDIT:

Ausnahme für Klarheit:

Caused by: java.lang.LinkageError: loader constraint violation in interface itable initialization: when resolving method "org.apache.axis.message.MessageElement.getChildElements(Ljavax/xml/namespace/QName;)Ljava/util/Iterator;" the class loader (instance of org/apache/felix/framework/BundleWiringImpl$BundleClassLoaderJava5) of the current class, org/apache/axis/message/MessageElement, and the class loader (instance of) for interface javax/xml/soap/SOAPElement

Antwort

0

entfernen axis-jaxrpc von <Embed-Dependency> und fügen Sie die Pakete von axis-jaxrpc, die Sie zu <Private-Package> Abschnitt kümmern - das wird in Ihrem Paket eingebettet werden. Möglicherweise müssen Sie dasselbe für die Pakete axis-jaxrpc tun, hängt davon ab, oder fügen Sie die entsprechenden Abhängigkeitsbündel zu <Embed-Dependency>

hinzu
Verwandte Themen