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

maven-shade-plugin-how-to-create-javaspring-based-executable-jar-with-all-required-dependencies

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

maven-resources-maven-dependency-maven-jar-plugin-to-build-java-project

After: Usando o plugin maven-shade:

create-just-1-executable-jar-with-all-required-dependencies-properties-and-resources-file-in-it-for-your-java-or-spring-project

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:

  1. Como criar um jar executável baseado em mola com o maven?
  2. Criando uma distribuição binária executável com Maven para Java + Spring + Outras dependências
  3. 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> .

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.

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.