2012-01-02 3 views
11

Я пытаюсь минимизировать размер UberJar, используя Maven Shade PluginminimizeJar. Похоже, что minimizeJar включает только классы, которые статически импортированы в код (я подозреваю это, потому что я вижу LogFactory.class в uber jar на org\apache\commons\logging\, но классы impl не включены, поэтому бросать java.lang.ClassNotFoundException: org.apache.commons.logging.impl.LogFactoryImpl при запуске uber-jar).настроить Maven Shade minimJar, чтобы включить файлы классов

Могу ли я сказать плагин Maven's Shade для включения указанных пакетов в финальную банку, независимо от того, что предлагает minimizeJar?

Здесь ПОМ фрагмент того, что я пытаюсь:

<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/**' соответствует только каталогам, возможно, вы захотите сопоставить все файлы. Вместо этого используйте 'org/apache/commons/logging/**/*'. – Corubba

+0

Следуя вашему предложению, я попробовал «... logging/**', '... logging/**/*', '... logging /**/*.*', но никто не работал. Я предполагаю, что проблема включает в себя включенные сначала, а затем minimJar игнорирует все остальное и связывает банку, как она считает подходящей. – kunal

ответ

14

Эта функция была добавлена ​​в версии 1.6 из Maven-тени-плагин (только что выпустили). minimJar теперь не будет удалять классы, которые были специально включены в фильтры. Обратите внимание, что включение некоторых классов артефактов в фильтр исключает не указанные классы для этого артефакта, поэтому обязательно включите все классы, которые вам нужны.

Вот пример плагин конфигурации:

<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

Нижняя строка ' **' не помогла мне. Похоже, что в него также входит множество других вещей. Вместо этого мне пришлось использовать ' org/apache/logging/log4j/** Log4j- *' – Quantum7

10

Я использую версию Shade плагин Maven 2.0 и до сих пор я не могу включить классы после «минимизируя» ЕАО.

Как обходное решение, единственное, что приходит мне на ум - создать ссылки на необходимые классы, чтобы избежать кода минимизации, чтобы избавиться от них. то есть:

/* 
* 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 
    }; 
} 

Я надеюсь, что разработчики Maven реализуют способ справиться с этой ситуацией (что, я думаю, очень распространено).

+0

nice workaround :) – kunal

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