настроить Maven Shade minimalJar для включения файлов классов - PullRequest
11 голосов
/ 02 января 2012

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

Есть ли какой-нибудь способ, которым я могу сказать плагину 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>

Ответы [ 2 ]

14 голосов
/ 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>
10 голосов
/ 25 апреля 2013

Я использую версию 2.0 Maven Shade Plugin и все еще не могу включить классы после "минимизации" JAR.

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

/*
 * 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 реализуют способ справиться с этой ситуацией (что, я думаю, очень распространено).

...