shade plugin exclude dependency java maven maven-plugin executable-jar

java - exclude - Minimiza un Uber Jar correctamente, usando Shade-Plugin



maven-shade-plugin (1)

Esta funcionalidad se ha agregado a la versión 1.6 del plug-in de maven-shade (recién lanzado). MinimizarJar ahora no eliminará las clases que se han incluido específicamente con los filtros. Tenga en cuenta que incluir algunas de las clases de un artefacto en un filtro excluirá las clases no especificadas para ese artefacto, así que asegúrese de incluir todas las clases que necesite.

Aquí hay un ejemplo de configuración de plugin:

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

Para incluir clases específicas, agréguelos como incluye el uso de barras inclinadas en el nombre de la clase en un filtro (de nuevo, las clases no incluidas se excluirán automáticamente).

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

Estoy usando el complemento de sombra de Maven para crear un Uber-jar ejecutable. De acuerdo con el último cuadro de esta página , el tamaño del frasco se puede minimizar usando:

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

Pero esta característica no tiene en cuenta las clases que se declaran en el archivo log4j.properties. Por lo tanto, por ejemplo, org.apache.log4j.appender.TimeAndSizeRollingAppender no se incluye en el Uber-jar, aunque se declara en el archivo log4j.properties.

Creo que voy a enfrentar el mismo problema con la primavera. Si mi código solo hace referencia a la interfaz A y mi archivo Spring contiene una instanciación de la clase B que implementa A, entonces B podría no agregarse al contenedor, ya que no está en el código.

¿Como puedó resolver esté problema?