Плагин Shade объединяет все зависимости с разработанным кодом и объединяет их в один Uber JAR. Недостатком является то, что он может перезаписывать файлы ресурсов и плохо работает с подписанными банками (по моему опыту, по крайней мере).
Я бы порекомендовал отойти от плагина затенения, если это вообще возможно.
Тем не менее, если вам придется его использовать - возможно, проблема в объединении ресурсов jar. Есть много преобразователей, которые вы можете использовать для решения этой проблемы, и вам нужно выяснить, какой из них действительно нужен. Я бы начал с чего-то вроде этого
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<configuration>
<shadedArtifactAttached>true</shadedArtifactAttached>
<shadedClassifierName>${executable.classifier}</shadedClassifierName>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>fully.qualified.ClassName</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
Вы можете найти больше транформеров в плагине Apache здесь
Альтернатива, которую я бы предложил, это Spring Boot, которая используетструктура Jar-in-Jar с пользовательским ClassLoader для загрузки классов из внутреннего jar-файла.
Это более простой метод, поскольку нет необходимости перезаписывать файлы как подход к плагину Shade, и он обрабатываетзависимости немного лучше.
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.3.6.RELEASE</version>
<configuration>
<classifier>${executable.classifier}</classifier>
<layout>ZIP</layout>
<mainClass>fully.qualified.ClassName</mainClass>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
Серьезно, взгляните на более простую конфигурацию!
ПРИМЕЧАНИЕ: Большая часть этого пришла из моих собственных заметок - номера версий могут быть немного старыми ...