2013-08-16 3 views
10

Я использую плагин maven-shade, чтобы переместить некоторые пакеты во время фазы пакета моей сборки. Я также использую maven-bundle-plugin для создания манифеста. Проблема заключается в том, что плагин bundle запускается перед плагином тени (на этапе фаз процессов) и не включает в себя какие-либо из моих заштрихованных пакетов в экспорте сгенерированного манифеста.Использование maven-bundle-plugin с плагином maven-shade

Как я могу заставить эти два плагина хорошо играть друг с другом, чтобы мои перемещенные пакеты обрабатывались как любой другой пакет плагином bundle?

-

По желанию, в тени и пучка разделов моей 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> 

Взятые from here

+0

Пожалуйста, разместите соответствующие части вашего pom.xml, включая разделы '' и ''. –

+0

Связано это с osgi и/или предохранителем ESB? стоит добавить теги? – vikingsteve

+0

@ AnthonyAccioly - отправлено. – Jonathan

ответ

1

Я полагаю, что после того, как compile фаза будет сделано, вы хотите:

  1. передислоцировать некоторые классы с помощью плагина тени
  2. создать манифест с расслоением плагин
  3. пакет все это с фляги плагин

Проблема расслоение плагин работает до плагин тени

Расслоение плагин связанного приложения к process-classes фазе, которая приходит before фаза package, к которой привязан плагин.

Предлагаю вам привязать плагин для тени к фазе process-classes. Изменение оттенок конфигурация плагина, как это:

<phase>process-classes</phase> 

Поскольку определение оттенка плагина поставляется перед определением расслоения плагиных в файле п, плагина тени будет работать до плагина расслоения во время process-classes фазы.

+0

К сожалению, это не сработает. Он не работает с чем-то вроде этого. Не удалось выполнить цель org.apache.maven.plugins: maven-shade-plugin: 2.1: shade (default) для modelMapper проекта: Не удалось создать затененный артефакт, главный артефакт проекта не существует. ' – Jonathan

5

Другой вариант - полностью скомпоновать плагин maven bundle и использовать Maven Shade Plugin ManifestResourceTransformer, чтобы добавить необходимые метаданные OSGI в манифест.

См. Пример 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

Решение очень простое. Вы все равно можете использовать maven-bundle-plugin и maven-shade-plugin одновременно. Вам просто нужно запомнить о заказе. Если вы используете пакетную упаковку, плагин maven bundle будет выполняться во время фазы пакета до maven-shade. Но это не так.

Здесь находится сделка.

  • Использование частного пакета: pkg.name.before.затенение
  • Make Maven-тень-плагин с один < включают > нуля: нуль </включают > - это предотвратит тень плагин от создания пустого кувшина
  • использовать Maven-тень-плагин переездов - от pkg.name.before. затенение на other.pkg.

Вы можете увидеть этот трюк работает в FasterXML jackson-module-paranamer

0

Существует изящное transformer реализации только этой функции от Hazelcast - HazelcastManifestTransformer (ver 3.9). То, что он делает, задумчиво объединяет атрибуты Import-Package и Export-Package, позволяя пользователю исключать продление/уменьшение объединенного результата по умолчанию.

Как использовать его в 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> 

инструкции переопределения (Export/Import-Package) используется запятая имена пакетов, которым предшествуют с восклицательным знаком всякий раз, когда мы хотим, чтобы исключить те специфические из списка.

Надеюсь, это поможет! Я понимаю, что это старый вопрос, но, похоже, трансформатор Hazelcast не получает широкой рекламы.

Смежные вопросы