2013-08-16 28 views
10

Używam wtyczki maven-shade-plug do przeniesienia niektórych pakietów podczas fazy pakietu mojej kompilacji. Używam również wtyczki maven-bundle do generowania manifestu. Problem polega na tym, że wtyczka pakietu działa przed wtyczką cienia (podczas fazy klas procesów) i nie zawiera żadnych z moich zacienionych pakietów w eksportach wygenerowanego pliku manifestu.Używanie wtyczki maven-bundle z wtyczką maven-shade

Jak mogę dostać te dwie wtyczki grać ładny ze sobą, tak że moje przemieszczane opakowania są traktowane jak każdy inny pakiet przez wtyczkę wiązki?

-

zamówienie, cieniu i wiązek odcinków mojego 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> 

Zrobiono from here

+0

Należy opublikować odpowiednie części pliku pom.xml, w tym "" i "". –

+0

Czy jest to związane z osgi i/lub bezpiecznikiem ESB? warto dodać te tagi? – vikingsteve

+0

@AnthonyAccioly - opublikowany. – Jonathan

Odpowiedz

1

Zakładam, że po fazie compile odbywa chcesz:

  1. Przeniesienie niektórych klas za pomocą wtyczki koloru
  2. tworzenia manifestu z wtyczką wiązki
  3. pakiet to wszystko do góry z wtyczką słoik

Problemem jest plugin wiązka biegnie przed cieniu wtyczki

Wtyczka wiązki jest zbindowanych do process-classes faza, która przychodzi before fazy package, z którą jest związana wtyczka koloru.

I sugerują, że wiążą się z wtyczki odcień process-classes fazie również. Konfiguracja wtyczki zmiana cień tak:

<phase>process-classes</phase> 

Ponieważ definicja cień wtyczki przychodzi przed definicją wtyczki wiązki w pliku POM, wtyczki cień będą uruchamiane przed wtyczkę wiązki podczas fazy process-classes.

+0

Niestety to nie działa. Nie powiedzie się z czymś takim: 'Nie udało się wykonać celu org.apache.maven.plugins: maven-shade-plugin: 2.1: shadow (domyślnie) na mapie modelu projektu: Nie można utworzyć zacienionego artefaktu, główny artefakt projektu nie istnieje." – Jonathan

5

Inną opcją jest zrzucenie wtyczki maven w pakiecie i użycie wtyczki Maven Shade ManifestResourceTransformer, aby dodać żądane metadane OSGI do manifestu.

Zobacz przykład xbean-asm-shaded/pom.xml.

<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

Rozwiązanie jest bardzo proste. Nadal można używać Maven-bundle-plugin i maven-cieniu wtyczki w tym samym czasie. Musisz tylko pamiętać o zamówieniu. Jeśli użyjesz pakietu pakowanie, wtyczka pakietu maven zostanie wykonana w fazie pakietu przed maven-shade. Ale to nie jest tak źle.

Oto sprawa.

  • Użyj prywatnego pakietu: pkg.name.before.osłaniając
  • Dokonaj Maven-cieniu wtyczkę z jednym < obejmują > NULL: null </include > - to zapobiegnie odcień wtyczki od stworzenia pustego słoika delokalizacji
  • użytku Maven-cień-plugin - od pkg.name.before. cieniowanie do innego.pkg.

Można zobaczyć ten trik działa w FasterXML jackson-module-paranamer

0

Jest schludny transformer realizacji tylko tę funkcjonalność z Hazelcast - HazelcastManifestTransformer (ver 3.9). To, co robi, polega na starannym połączeniu atrybutów Import-Package i Export-Package, dzięki czemu użytkownik może wykluczyć rozszerzenie/zmniejszenie domyślnego wyniku scalonego.

Jak używać go w 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> 

Instrukcje nadpisywania (Export/Import-Package) są rozdzielany przecinkami nazwy pakietów, poprzedzone z wykrzyknikiem, gdy chcemy, aby wykluczyć te konkretne te z listy.

Mam nadzieję, że to pomoże! Zdaję sobie sprawę, że to stare pytanie, ale wydaje się, że transformator Hazelcasta nie zyskuje większego rozgłosu.