Настроить Maven Shade minimJar для включения файлов классов
Я пытаюсь минимизировать размер UberJar, используя Maven Shade Plugin
minimizeJar
. Похоже, что minimizeJar
включает только классы, статически импортированные в код (я подозреваю это, потому что я вижу LogFactory.class
в uber jar в org\apache\commons\logging\
, но не включены классы пакета impl
, поэтому бросать java.lang.ClassNotFoundException: org.apache.commons.logging.impl.LogFactoryImpl
когда я запускаю uber-jar).
Можно ли каким-либо образом сказать плагин Maven Shade включить указанные пакеты в финальную банку, независимо от того, что предлагает minimizeJar
?
Вот фрагмент pom, который я пытаюсь:
<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
Эта функциональность была добавлена в версию 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>
Ответ 2
Я использую 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 реализуют способ справиться с этой ситуацией (что, я думаю, очень распространено).