2012-01-02 9 views
11

Sto cercando di ridurre le dimensioni di UberJar utilizzando Maven Shade Plugin di minimizeJar. Sembra che minimizeJar includa solo le classi importate staticamente nel codice (presumo questo perché vedo LogFactory.class in jar uber al numero org\apache\commons\logging\ ma non sono incluse classi del pacchetto impl, quindi lanciando java.lang.ClassNotFoundException: org.apache.commons.logging.impl.LogFactoryImpl quando eseguo il uber-jar).configure Maven Shade minimizzaJar per includere i file di classe

C'è un modo in cui posso dire al plug-in Shade di Maven di includere pacchetti specificati nel contenitore finale, a prescindere da cosa suggerisca lo minimizeJar?

Qui il pom frammento di quello che sto cercando:

<plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-shade-plugin</artifactId> 
     <version>1.5</version> 
     <executions> 
      <execution> 
       <phase>package</phase> 
       <goals> 
        <goal>shade</goal> 
       </goals> 
       <configuration> 
        <minimizeJar>true</minimizeJar> 
        <filters> 
         <filter> 
          <artifact>commons-logging:commons-logging</artifact> 
          <includes> 
           <include>org/apache/commons/logging/**</include> 
          </includes> 
         </filter>  
        </filters> 
        <transformers> 
         <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
          <mainClass>com.myproject.Main</mainClass> 
         </transformer> 
        </transformers>        
       </configuration> 
      </execution> 
     </executions> 
    </plugin> 
+1

'org/apache/commons/logging/**' corrisponde solo alle directory, potresti voler abbinare tutti i file. Usa invece 'org/apache/commons/logging/**/*'. – Corubba

+0

Seguendo il tuo suggerimento, ho provato '... logging/**', '... logging/**/*', '... logging /**/*.*' ma nessuno ha funzionato. Immagino che il problema includa sia incluso prima che minimizzareJar ignora tutto il resto e impacchetta il barattolo come pensa sia adatto. – kunal

risposta

14

Questa funzionalità è stata aggiunta alla versione 1.6 del Maven-ombra-plugin (appena pubblicato). minimizzaJar ora non rimuoverà le classi che sono state specificatamente incluse con i filtri. Nota che includere alcune delle classi di un artefatto in un filtro escluderà le classi non specificate per tale artefatto, quindi assicurati di includere tutte le classi di cui hai bisogno.

Ecco un esempio di configurazione del plugin:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-shade-plugin</artifactId> 
    <version>1.6</version>  
    <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>shade</goal> 
      </goals>       
      <configuration> 
       <minimizeJar>true</minimizeJar>  
       <filters> 
        <filter> 
         <artifact>log4j:log4j</artifact> 
         <includes> 
          <include>**</include> 
         </includes> 
        </filter> 
        <filter> 
         <artifact>commons-logging:commons-logging</artifact> 
         <includes> 
          <include>**</include> 
         </includes> 
        </filter>      
       </filters> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 
+0

Il livello inferiore ' **' non ha funzionato per me. Sembra includere molte cose anche da altri pacchetti. Invece ho dovuto usare ' org/apache/logging/log4j/** Log4j- *' – Quantum7

10

Sto usando la versione 2.0 del Plugin Ombra Maven e ancora non sono in grado di includere le classi dopo "minimizzare" il JAR.

Per risolvere il problema, l'unica cosa che mi viene in mente è creare riferimenti alle classi necessarie per evitare il codice di minimizzazione per eliminarle. vale a dire:

/* 
* This block prevents the Maven Shade plugin to remove the specified classes 
*/ 
static { 
    @SuppressWarnings ("unused") Class<?>[] classes = new Class<?>[] { 
     JButton.class, 
     JMenu.class, 
     JMenuBar.class, 
     JMenuItem.class 
    }; 
} 

Spero sviluppatori Maven implementare un modo per gestire questa situazione (che credo sia molto comune).

+0

bella soluzione :) – kunal

Problemi correlati