2013-08-16 16 views
10

Uso il plugin maven-shade-per riposizionare alcuni pacchetti durante la fase del pacchetto della mia build. Sto anche usando il plugin maven-bundle per generare un manifest. Il problema è che il plugin bundle viene eseguito prima del plug-in di ombreggiatura (durante la fase delle classi di processo) e non include nessuno dei miei pacchetti ombreggiati nelle esportazioni del manifest generato.Uso di maven-bundle-plugin con il plugin maven-shade

Come posso far sì che questi due plug-in siano piacevoli l'uno con l'altro, in modo che i pacchetti trasferiti vengano trattati come qualsiasi altro pacchetto dal plugin bundle?

-

Su richiesta, l'ombra e le sezioni fascio di mia POM:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-shade-plugin</artifactId> 
    <executions> 
     <execution> 
     <phase>package</phase> 
     <goals> 
      <goal>shade</goal> 
     </goals> 
     </execution> 
    </executions> 
    <configuration> 
     <filters> 
     <filter> 
      <artifact>cglib:cglib</artifact> 
      <includes> 
      <include>net/sf/cglib/core/**</include> 
      <include>net/sf/cglib/proxy/**</include> 
      </includes> 
     </filter> 
     </filters> 
     <relocations> 
     <relocation> 
      <pattern>net.sf.cglib</pattern> 
      <shadedPattern>org.modelmapper.internal.cglib</shadedPattern> 
     </relocation> 
     <relocation> 
      <pattern>org.objectweb.asm</pattern> 
      <shadedPattern>org.modelmapper.internal.asm</shadedPattern> 
     </relocation> 
     </relocations> 
    </configuration> 
    </plugin> 

    <plugin> 
    <groupId>org.apache.felix</groupId> 
    <artifactId>maven-bundle-plugin</artifactId> 
    <version>2.3.7</version> 
    <executions> 
     <execution> 
     <id>bundle-manifest</id> 
     <phase>process-classes</phase> 
     <goals> 
      <goal>manifest</goal> 
     </goals> 
     </execution> 
    </executions> 
    <configuration> 
     <instructions> 
     <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName> 
     <Export-Package> 
      org.modelmapper, 
      org.modelmapper.builder, 
      org.modelmapper.config, 
      org.modelmapper.convention, 
      org.modelmapper.spi 
     </Export-Package> 
     <Private-Package> 
      org.modelmapper.internal.** 
     </Private-Package> 
     <Import-Package> 
      * 
     </Import-Package> 
     <Include-Resource> 
      {maven-resources}, 
      {maven-dependencies} 
     </Include-Resource> 
     </instructions> 
    </configuration> 
    </plugin> 

Preso from here

+0

si prega di inviare le parti pertinenti del tuo pom.xml, tra cui '' e '' sezioni. –

+0

Questo è collegato a osgi e/o al fusibile ESB? vale la pena aggiungere quei tag? – vikingsteve

+0

@AnthonyAccioly - pubblicato. – Jonathan

risposta

1

Presumo che dopo la fase compile è fatto si desidera:

  1. riposizionare alcune classi con il plug-in dello schermo
  2. creare un manifesto con il plugin fascio
  3. pacchetto tutto con il plugin vaso

Il problema è il plugin fascio corre prima che il plug-in ombra

Il plugin bundle è rilegato a process-classes fase che viene before la fase package a cui è associato il plugin di ombreggiatura.

Suggerisco di associare il plug-in dello schermo alla fase process-classes. Cambio ombra configurazione del plugin in questo modo:

<phase>process-classes</phase> 

Poiché la definizione ombra plug-in viene prima la definizione fascio plug nel file pom, il plugin ombra verrà eseguito prima che il plugin fascio durante la fase di process-classes.

+0

Sfortunatamente non funziona. Fallisce con qualcosa di simile a 'Impossibile eseguire l'obiettivo org.apache.maven.plugins: maven-shade-plugin: 2.1: shade (default) sul modelmapper del progetto: Impossibile creare artefatto ombreggiato, l'artefatto principale del progetto non esiste. – Jonathan

5

Un'altra opzione è di scaricare del tutto il plugin del bundle Maven e utilizzare Maven Shade Plugin ManifestResourceTransformer per aggiungere i metadati OSGI desiderati al manifest.

Dai uno sguardo a xbean-asm-shaded/pom.xml per un esempio.

<transformers> 
    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
    <manifestEntries> 
     <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName> 
     <Export-Package> 
     org.apache.xbean.asm;org.modelmapper.builder; ... 
     </Export-Package> 
     <Import-Package>*</Import-Package> 
     <Private-Package>org.modelmapper.internal ...</Private-Package> 
    </manifestEntries> 
</transformer> 
1

La soluzione è molto semplice. Puoi ancora usare maven-bundle-plugin e maven-shade-plugin allo stesso tempo. Hai solo bisogno di ricordare l'ordine. Se si utilizza il pacchetto bundle, il plugin del pacchetto maven verrà eseguito durante la fase del pacchetto prima dell'ombra maven. Ma non è così sbagliato.

Ecco l'offerta.

  • Usa pacchetto privato: pkg.name.before.ombreggiatura
  • make Maven-ombra-plugin con uno <includono> nullo: null </include > - questo impedirà plug-ombra di creare barattolo vuoto delocalizzazioni
  • uso Maven-ombra-plugin - da pkg.name.before. ombreggiatura ad altro.pkg.

Si può vedere questo trucco funziona in FasterXML jackson-module-paranamer

0

C'è un pulito transformer attuazione solo questa funzionalità da Hazelcast - HazelcastManifestTransformer (ver 3.9). Quello che fa è meditando di unire gli attributi Import-Package e Export-Package, consentendo all'utente di escludere estendere/ridurre il risultato unito di default.

come usarlo nel vostro pom.xml:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-shade-plugin</artifactId> 
    <version>3.1.0</version> 
    <dependencies> 
    <dependency> 
     <groupId>com.hazelcast</groupId> 
     <artifactId>hazelcast-build-utils</artifactId> 
     <version>3.9</version> 
    </dependency> 
    </dependencies> 
    <executions> 
    <execution> 
     <phase>package</phase> 
     <goals> 
     <goal>shade</goal> 
     </goals> 
     <configuration> 
     <transformers> 
      <transformer implementation="com.hazelcast.buildutils.HazelcastManifestTransformer"> 
      <mainClass>...</mainClass> 
      <!-- the tag below is required due to a missing null-check it seems --> 
      <overrideInstructions></overrideInstructions> 
     </configuration> 
    </executions> 
</plugin> 

Le istruzioni di override (Export/Import-Package) sono virgola nomi di pacchetti delimitati, preceduti da un punto esclamativo ogni volta che vogliamo escludere quelle specifiche dalla lista.

Spero che questo aiuti! Capisco che è una vecchia domanda, ma sembra che il trasformatore di Hazelcast non stia guadagnando molta pubblicità.