Use “maven-shade-plugin” para criar apenas 1 jar executável com todas as dependências necessárias para o seu projeto Java ou Spring?
Publicados: 2016-11-16Basta criar um arquivo
Crunchify.jar
com todas as dependências dentro dele
Na semana passada eu escrevi um tutorial sobre como usar maven-resources-plugin
, maven-dependency-plugin
& maven-jar-plugin
para gerar seu projeto Jar executável completo? Como resultado, ele cria / copia todos os arquivos necessários para a pasta /target/Crunchify
.
Before:
Usando os plugins maven-resource, maven-dependency, maven-jar:
After:
Usando o plugin maven-shade:
Vamos começar sobre como alcançar o resultado acima:
Aqui como você vê, nós agrupamos tudo do Java Project em just one file
e demos o nome Crunchify.jar
(com todos os arquivos dentro).
Poucos dias atrás, eu não tinha ideia de como conseguir isso, pois queria criar uma runnable binary distribution of a standalone Java application
usando o Maven. Em outras palavras:
- Como criar um jar executável baseado em mola com o maven?
- Criando uma distribuição binária executável com Maven para Java + Spring + Outras dependências
- Como construir projetos Java + Spring com Maven?
Normalmente, no Maven, dependemos do gerenciamento de dependências. Um artefato contém apenas as classes/recursos de si mesmo. O Maven será responsável por descobrir todos os artefatos (JARs etc) que o projeto é dependente, ao compilar e rodar etc.
Com a ajuda do maven -shade- plugin
, consegui atingir esse objetivo . Ele fornece a capacidade de empacotar o artefato em um uber-jar (One major file jar)
, incluindo suas dependências e sombrear – ou seja, renomear – os pacotes de algumas das dependências.
No meu projeto eu tenho muitas outras dependências, ou seja, Spring Framework, JSON, ferramentas de terceiros, etc. Abaixo está apenas um projeto de amostra, mas meu arquivo .jar de produção ficou com ~5.2MB big
de tamanho .
Um
uber-jar
é algo que pega todas as dependências, extrai o conteúdo das dependências e coloca em um JAR, com as classes/recursos do próprio projeto. Por ter esse uber-jar, éeasy for execution
, porque você precisará apenas de um grande JAR em vez de toneladas de pequenos JARs para executar seu aplicativo. Também facilita a distribuição em alguns casos.
Para conseguir isso, você precisa atualizar seu arquivo pom.xml.
Passo 1
Dê uma olhada no arquivo pom.xml
completo. Principalmente você estaria interessado na tag <build>
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
< project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns : xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi : schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" > < modelVersion > 4.0.0 < / modelVersion > < groupId > CrunchifyMavenBuildPlugins < / groupId > < artifactId > CrunchifyMavenBuildPlugins < / artifactId > < version > 0.0.1 - SNAPSHOT < / version > < name > CrunchifyMavenBuildPlugins < / name > < properties > < project . build . sourceEncoding > UTF - 8 < / project . build . sourceEncoding > < / properties > < dependencies > < dependency > < groupId > log4j < / groupId > < artifactId > log4j < / artifactId > < version > 1.2.17 < / version > < / dependency > < dependency > < groupId > com . googlecode . json - simple < / groupId > < artifactId > json - simple < / artifactId > < version > 1.1 < / version > < / dependency > < dependency > < groupId > axis < / groupId > < artifactId > axis < / artifactId > < version > 1.4 < / version > < / dependency > < dependency > < groupId > commons - beanutils < / groupId > < artifactId > commons - beanutils < / artifactId > < version > 1.8.3 < / version > < / dependency > < dependency > < groupId > commons - collections < / groupId > < artifactId > commons - collections < / artifactId > < version > 3.2.1 < / version > < / dependency > < dependency > < groupId > commons - configuration < / groupId > < artifactId > commons - configuration < / artifactId > < version > 1.10 < / version > < / dependency > < dependency > < groupId > commons - io < / groupId > < artifactId > commons - io < / artifactId > < version > 2.4 < / version > < / dependency > < dependency > < groupId > javax . mail < / groupId > < artifactId > mail < / artifactId > < version > 1.4.7 < / version > < / dependency > < dependency > < groupId > javax . servlet < / groupId > < artifactId > servlet - api < / artifactId > < version > 2.5 < / version > < / dependency > < dependency > < groupId > org . json < / groupId > < artifactId > json < / artifactId > < version > 20140107 < / version > < / dependency > < dependency > < groupId > axis < / groupId > < artifactId > axis - saaj < / artifactId > < version > 1.4 < / version > < / dependency > < dependency > < groupId > wsdl4j < / groupId > < artifactId > wsdl4j < / artifactId > < version > 1.6.3 < / version > < / dependency > < dependency > < groupId > com . google . zxing < / groupId > < artifactId > core < / artifactId > < version > 2.0 < / version > < / dependency > < / dependencies > < build > < pluginManagement > < plugins > < plugin > < groupId > org . apache . maven . plugins < / groupId > < artifactId > maven - compiler - plugin < / artifactId > < version > 2.3.1 < / version > < configuration > < source > 1.7 < / source > < target > 1.7 < / target > < / configuration > < / plugin > < / plugins > < / pluginManagement > < plugins > < plugin > < groupId > org . apache . maven . plugins < / groupId > < artifactId > maven - shade - plugin < / artifactId > < version > 1.7 < / version > < executions > < execution > < phase > package < / phase > < goals > < goal > shade < / goal > < / goals > < configuration > < ! -- Optional Start -- > < finalName > Crunchify < / finalName > < shadedArtifactAttached > true < / shadedArtifactAttached > < shadedClassifierName > jar - with - dependencies < / shadedClassifierName > < ! -- Optional End -- > < transformers > < transformer implementation = "org.apache.maven.plugins.shade.resource.ManifestResourceTransformer" > < mainClass > com . crunchify . tutorial . CrunchifyMain < / mainClass > < / transformer > < transformer implementation = "org.apache.maven.plugins.shade.resource.AppendingTransformer" > < resource > META - INF / spring . handlers < / resource > < / transformer > < transformer implementation = "org.apache.maven.plugins.shade.resource.AppendingTransformer" > < resource > META - INF / spring . schemas < / resource > < / transformer > < transformer implementation = "org.apache.maven.plugins.shade.resource.AppendingTransformer" > < resource > META - INF / spring . tooling < / resource > < / transformer > < / transformers > < / configuration > < / execution > < / executions > < / plugin > < / plugins > < / build > < / project > |
Como você pode ver aqui estou usando Resource Transformers
no arquivo pom.xml. Agregar classes/resources
de vários artefatos em um Crunchify JAR
é simples, desde que não haja sobreposição. Caso contrário, será necessário algum tipo de lógica para mesclar recursos de vários JARs. É aqui que os transformadores de recursos entram em ação.

Passo 2
Depois de adicionar maven-shade-plugin
ao seu arquivo pom.xml
, basta usar o comando abaixo para construir seu projeto.
1 |
mvn clean install |
E você deve ver um Crunchify.jar
(uber-jar) criado com all dependencies mentioned in pom.xml file
dentro.
Etapa 3
Vá para a pasta de destino do seu projeto e você verá o arquivo Crunchify.jar criado. Basta usar o comando
$bash> java -jar Crunchify.jar
para executar seu projeto.
Você tem algo a acrescentar? Adicione-o à seção de comentários abaixo. Aproveite, tenha um ótimo dia pela frente e boa codificação.