2016-01-22 7 views
8

Desidero utilizzare jar da un fornitore di terze parti. Ma in questo barattolo ho una vecchia versione del pacchetto Java org.osgi.framework Ho bisogno di trovare un modo per escludere il pacchetto dal progetto principale. Qualcosa di simile:Escludere il pacchetto Java dal contenitore delle dipendenze

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

Potete consigliare qualche soluzione?

risposta

4

Anche se una soluzione migliore sarebbe quella di ri-confezionare la dipendenza (senza il pacchetto di indesiderato) con un classificatore (come descritto nel this answer) e pubblicarlo sul proprio repository aziendale Maven (o install it nella cache Maven locale, se si tratta di un progetto personale), di seguito è una soluzione diversa che dovrebbe soddisfare anche le vostre esigenze.

si potrebbe avere un progetto multi-module Maven, avendo un modulo con solo questa dipendenza e in essa è possibile utilizzare la sua proprietà Maven Shade Plugin e filters come spiegato nella sua official example.

Come per documentation, l'elemento filters:

Filtri archivio da utilizzare. Consente di specificare un manufatto in forma di un identificatore composito come quello usato dal artifactSet e una serie di includere/escludere i modelli di file per il filtraggio cui contenuto dell'archivio vengono aggiunti al barattolo ombreggiata

Nel tuo caso, il seguente configurazione dovrebbe applicare il filtro:

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

il vaso generato dalla fase package non deve contenere quel pacchetto più. Come parte della produzione Maven si dovrebbe vedere:

[INFO] --- Maven-ombra-plugin: 2.4.3: Ombra (default) @ test-checksum ---
[INFO] Compresi com .ibm: com.ibm.ws.admin.client: jar: 8.5.0 nel barattolo ombreggiato.
[INFO] Sostituzione di artefatto originale con artefatto ombreggiato.

È possibile verificare il contenuto del contenitore generato, il pacchetto filtrato non dovrebbe essere lì.

Quindi, l'output di questo modulo avrà il "nuovo"/vaso filtrato che stavi cercando. Quindi il modulo consumer dovrebbe solo avere una dipendenza da questo modulo e come tale avere applicato il filtro.
Un esempio di un progetto così multimodulo sarebbe:

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

Aggiornamento
Nota ulteriore: nel modulo che applica il filtro, si dovrebbe dichiarare la dipendenza come optional in modo che il modulo consumatore non lo fa portalo di nuovo in transito.

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

opzionale non influisce sul modulo stesso, solo il consumatore uno. E il plugin di Shade continuerà a funzionare (l'ho ri-testato, per ogni evenienza).

+0

Ecco il repository https: // bitbucket.org/rcbandit/repository/raw/master/ –

+0

@PeterPenzov hai provato l'approccio sopra? ha funzionato? –

+0

No, ho ancora lo stesso problema anche con la soluzione proposta. –