2017-10-02 4 views
0

J'ai besoin d'une des librairies Apache (axis-jaxrpc) dans mon bundle OSGi, mais elle est en quelque sorte défectueuse car son jar contient une classe des built-ins java (javax.xml.namespace.QName). Je ne peux pas le remplacer par une autre alternative - c'est une dépendance latérale pour une autre dépendance pour ...... vous savez comment ça se passe :)Les plugins maven bundle plugin excluent les fichiers ou les packages

Le problème est que chaque fois que je fais le paquet et l'allume il commence très bien. Mais si je touche une fonctionnalité liée à jaxrpc je reçois un LinkageError affirmant que QName a déjà été chargé par <bootloader>. J'ai réussi à exploser jaxrpc jar dans mon jar bundle et supprimer le répertoire javax.namespace manuellement (à savoir modifier le contenu du jar bundle) avant de lancer l'application. Cela a fait l'affaire - je n'ai plus l'LinkageError.

Maintenant la question est ... Comment gérer cette situation d'une manière non-sado-maso et exclure la classe/le paquet incriminé du fichier jar incorporé?

extraits POM:

dépendances:

<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> 

reformule ... Est-il possible ne faire qch comme ceci:

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

EDIT:

exception pour plus de clarté:

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

Répondre

0

Retirez axis-jaxrpc de <Embed-Dependency> et ajoutez les paquets de axis-jaxrpc que vous vous souciez de <Private-Package> section - ceux-ci seront intégrés dans votre paquet. Vous devrez peut-être faire de même pour les paquets axis-jaxrpc dépend ou ajouter les groupes de dépendances respectifs à <Embed-Dependency>