Правильно сверните Uber Jar, используя Shade-Plugin - PullRequest
25 голосов
/ 11 января 2012

Я использую Maven-Shade-Plugin для создания работающего Uber-jar. В соответствии с последним кадром на этой странице размер банки можно уменьшить с помощью:

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

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

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

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

1 Ответ

31 голосов
/ 19 марта 2012

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

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

<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>

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

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