2016-01-22 9 views
8

Ich möchte jar vom Drittanbieter verwenden. Aber in diesem Jar habe ich alte Version von Java-Paket org.osgi.framework Ich muss einen Weg finden, um das Paket aus dem Hauptprojekt auszuschließen. Etwas wie dieses:Java-Paket vom Abhängigkeits-Jar ausschließen

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

Können Sie eine Lösung empfehlen?

Antwort

4

Obwohl eine bessere Lösung wäre es, die Abhängigkeit wieder einpacken (ohne das unerwünschte Paket) mit einem Klassifizierer (wie in this answer beschrieben) und veröffentlichen Sie es auf Ihrem Unternehmen Maven Repository (oder install it in Ihrem lokalen Maven-Cache, wenn es ein persönliches Projekt), unten ist eine andere Lösung, die auch Ihren Bedürfnissen entsprechen sollte.

Sie könnten ein multi-module Maven Projekt haben, ein Modul mit nur dieser Abhängigkeit und darin mit konnte man die Maven Shade Plugin und seine filters Eigenschaft als in seiner official example erläutert.

Wie pro documentation, das filters Element:

Archive Filter verwendet werden. Ermöglicht es Ihnen, einen Artefakt in Form einer zusammengesetzten Kennung angeben und wurden von artifactSet und eine Reihe von/Ausschluss von Dateimustern zum Filtern der Inhalte des Archivs hinzugefügt werden das schraffierten Glas

In Ihrem Fall der Konfiguration folgende soll die Filter anzuwenden:

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

Das erzeugte Glas aus der package Phase soll nicht das Paket nicht mehr enthalten. Im Rahmen der Maven Ausgabe sollten Sie sehen:

[INFO] --- Maven-Schatten-Plugin: 2.4.3: Schatten (default) @ Test-Prüfsumme ---
[INFO] Einschließlich com .ibm: com.ibm.ws.admin.client: jar: 8.5.0 im schattierten Jar.
[INFO] Ersetzen des ursprünglichen Artefakts durch schattiertes Artefakt.

Sie können den Inhalt des generierten jar überprüfen, das gefilterte Paket sollte nicht da sein.

Dann wird die Ausgabe dieses Moduls das "neue"/gefilterte Glas haben, nach dem Sie gesucht haben. Dann müsste das Verbrauchermodul nur noch von diesem Modul abhängig sein und als solches den Filter anwenden.
Ein Beispiel für ein solches Multimodul-Projekt wäre:

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

aktualisieren
Weitere Anmerkung: im Modul, das den Filter angewendet wird, sollten Sie die Abhängigkeit als optional erklären, so dass das Modul Verbraucher nicht Bring es wieder transitiv rein.

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

Optional wirkt sich nicht auf das Modul selbst, nur die Verbraucher ein. Und das Shade-Plugin wird weiter funktionieren (ich habe es erneut getestet, nur für den Fall).

+0

Hier ist das Repository https: // bitbucket.org/rcbandit/repository/rohe/master/ –

+0

@PeterPenzov hast du den obigen Ansatz versucht? hat es geklappt? –

+0

Nein, ich habe immer noch das gleiche Problem, selbst mit der vorgeschlagenen Lösung. –