2012-01-11 2 views
20

Я использую Maven-Shade-Plugin для создания runnable Uber-jar. Согласно последнему кадру на this page, размер кувшина может быть сведено к минимуму с помощью:Минимизировать Uber Jar правильно, используя Shade-Plugin

<configuration> 
     <minimizeJar>true</minimizeJar> 
</configuration> 

Но эта функция не принимает во внимание классы, объявленные в файле log4j.properties. Следовательно, например, org.apache.log4j.appender.TimeAndSizeRollingAppender не включен в Uber-jar, хотя он объявлен в файле log4j.properties.

Я верю, что столкнутся с той же проблемой с весной. Если мой код относится только к интерфейсу A, а мой файл Spring содержит экземпляр класса B, который реализует A, то B не может быть добавлен в банку, поскольку он не находится в коде.

Как я могу решить эту проблему?

+0

Alsmot, но не совсем, дубликат http://stackoverflow.com/questions/8698814/configure-maven-shade-minimizejar-to-include-class-files – Raedwald

ответ

22

Эта функциональность была добавлена ​​в версию 1.6 плагина maven-shade (только что выпущена). 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> 

Для onlu включает конкретные классы, добавьте их в качестве включает в себя использование пути слэши в имени класса в фильтре (опять же, не-включены классы будут автоматически исключены).

<filter> 
    <artifact>org.yourorg:your-artifact</artifact> 
    <includes> 
    <include>org/yourorg/yourartifact/api/*</include> 
    <include>org/yourorg/yourartifact/util/*</include> 
    </includes> 
</filter> 
+0

Копия документации Maven. – Raedwald

+15

Да, я написал этот ответ и обновил документы Maven одновременно ... – Shane

+0

Можете ли вы поддержать опцию «всегда держать определенные классы»? Например, в конфигурации перечислены конкретные классы/маски для сохранения, а maven-shade-plugin автоматически вычисляет неиспользуемые классы? –

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