web-dev-qa-db-fra.com

Exclure Java du pot de dépendance

Je souhaite utiliser le pot d'un fournisseur tiers. Mais dans ce pot, j'ai l'ancienne version de Java package org.osgi.framework J'ai besoin de trouver un moyen d'exclure le package du projet principal. Quelque chose comme ça:

<dependency>
      <groupId>com.ibm</groupId>
          <artifactId>com.ibm.ws.admin.client</artifactId>
          <version>8.5.0</version>
          <exclusions>
             <exclusion>org.osgi.framework</exclusion>
          </exclusions>
          <type>jar</type>
</dependency>

Pouvez-vous recommander une solution?

16
Peter Penzov

Bien qu'une meilleure solution serait de reconditionner la dépendance (sans le package indésirable) avec un classificateur (comme décrit dans cette réponse ) et de la publier sur votre référentiel Maven d'entreprise (ou installer it dans votre cache Maven local, s'il s'agit d'un projet personnel), voici une solution différente qui devrait également répondre à vos besoins.

Vous pouvez avoir un multi-module projet Maven, ayant un module avec juste cette dépendance et vous pouvez y utiliser Maven Shade Plugin et sa propriété filters comme expliqué dans son exemple officiel .

Selon documentation , l'élément filters:

Filtres d'archivage à utiliser. Vous permet de spécifier un artefact sous la forme d'un identifiant composite tel qu'utilisé par artifactSet et un ensemble de modèles de fichier d'inclusion/exclusion pour filtrer le contenu de l'archive qui est ajouté au pot ombré

Dans votre cas, la configuration suivante doit appliquer le filtre:

<build>
    <plugins>
        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.4.3</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <filters>
                            <filter>
                                <artifact>com.ibm:com.ibm.ws.admin.client</artifact>
                                <excludes>
                                    <exclude>org/osgi/framework/**</exclude>
                                </excludes>
                            </filter>
                        </filters>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Le fichier jar généré à partir de la phase package ne devrait plus contenir ce package. Dans le cadre de la sortie Maven, vous devriez voir:

[INFO] --- maven-shadow-plugin: 2.4.3: ombre (par défaut) @ test-checksum ---
[INFO] Y compris com.ibm:com.ibm.ws.admin.client:jar:8.5.0 dans le pot ombré.
[INFO] Remplacement de l'artefact d'origine par un artefact ombré.

Vous pouvez vérifier le contenu du fichier jar généré, le package filtré ne devrait pas être là.

Ensuite, la sortie de ce module aura le "nouveau"/pot filtré que vous cherchiez. Ensuite, le module consommateur devrait simplement avoir une dépendance sur ce module et en tant que tel, appliquer le filtre.
Un exemple d'un tel projet multimodule serait:

+ aggregator/parent project
    - filtered-dependency-module (applying the shade filter)
    - consumer-module (having dependency on the filtered module)

Mise à jour
Remarque supplémentaire: dans le module qui applique le filtre, vous devez déclarer la dépendance comme facultatif afin que le module consommateur ne le réintègre pas de manière transitoire.

<dependencies>
    <dependency>
        <groupId>com.ibm</groupId>
        <artifactId>com.ibm.ws.admin.client</artifactId>
        <version>8.5.0</version>
        <optional>true</optional>
    </dependency>
</dependencies>

Facultatif n'affecte pas le module lui-même, seulement le consommateur. Et le plugin Shade continuera de fonctionner (je l'ai testé à nouveau au cas où).

6
A_Di-Matteo