Gerando um .jar com as dependências em um projeto Maven

Uma das coisas mais incovenientes para iniciantes em Maven é ao gerar um .jar da aplicação as dependências não serem incluídas no .jar final ou o .jar não inicializar a execução. Entretanto algumas configurações bem simples podem resolver esse problema e incluir as dependências corretamente. Aproveitamos o projeto do post anterior e adicionamos o trecho que código abaixo.

<!-- CONFIGURAÇÕES DE BUILD RESPONSÁVEIS POR INCLUIR AS DEPENDÊNCIAS NO .JAR FINAL -->

<build>
    <plugins>
       <!-- DEFINE O PLUGIN MAVEN RESPONSÁVEL POR COMPILAR O PROJETO SUA VERSÃO E O JDK UTILIZADO  -->
       <plugin>
            <groupid>org.apache.maven.plugins</groupid>
            <artifactid>maven-compiler-plugin</artifactid>
            <version>2.3.2</version>
            <configuration>
                <source>1.6
                <target>1.6</target>
            </configuration>
        </plugin>  

        <!-- DEFINE AS CONFIGURAÇÕES DO MAVEN ASSEMBLER  -->
        <plugin>
            <artifactid>maven-assembly-plugin</artifactid>
            <configuration>
                <archive>

                   <!-- DEFINE QUAL É A CLASSE MAIN DA APLICAÇÃO  -->
                    <manifest>
                        <addclasspath>true</addclasspath>
                        <mainclass>br.com.semeru.datesynchronizer.RecoveryDateWitchURL</mainclass>
                    </manifest>
                </archive>

                <!-- ADICIONO AO NOME DO JAR FINAL UM COMPLEMENTO DIZENDO
                     QUE ELE CONTÉM AS DEPENDÊNCIAS  -->

                <descriptorrefs>
                    <descriptorref>jar-with-dependencies</descriptorref>
                </descriptorrefs>
            </configuration>
            <executions>
                <execution>

                    <!-- DETERMINO QUE O JAR GERADO INCLUIRÁ AS DEPENDÊNCIAS E ELAS 
                    SERÃO EMPACOTADAS JUNTO COM O PROJETO EM UM ÚNICO JAR  -->

                    <id>make-my-jar-with-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Após executarmos a build veremos algo similar a imagem abaixo, são criados dois .jars um com e outro sem as dependências. Esse jar pode ser startado por duplo clique, pelo DOS ou pelo Shell do GNU/Linux.

MavenWithDependencies

Além disso se abrirmos o jar com uma ferramenta como o winrar veremos que além das classes no nosso projeto, assinalados em vermelho, temos também outros diretórios, assinalados em azul, contendo as dependências e as classes compiladas das mesmas como podemos observar nos pontos indicados pelas setas.

MavenWithDependencies2

Se você tem alguma dúvida relacionada ao conteúdo desse post sinta-se a vontade de comentar, criticar e/ou contribuir com o seu comentário. Além disso você pode acessar todo o código fonte desse projeto através do GitHub.

Treinamentos relacionados com este post














Leandro Costa

Sou desenvolvedor de software a desde 2008, além de programar gosto de esportes de aventura como rapel, tirolesa, trilhas de bike, apreciador de cervejas, baladas, motos e do bom e velho Rock’n Roll também gosto de história, ficção científica e de tecnologia. Atualmente sou consultor de Agile Software Delivery na Erudio Training e instrutor na Udemy.

8 thoughts to “Gerando um .jar com as dependências em um projeto Maven”

  1. Olá Leandro, muito bom o tutorial, estou precisando disso, preciso gerar um .jar com toda a aplicação + o tomcat pelo maven, como ficaria?

    É possível de alguma maneira incluir o banco?

    1. Pra fazer isso o melhor seria usar o Spring Boot que lhe permite criar um .jar da sua aplicação com o Jetty ou o Tomcat embutido que é a opção padrão. Ou um .war que poder ser implantado como qualquer arquivo .war. Se você não conhece o Spring Boot pode dar uma fuçada aqui no blog por que tem diversos posts a respeito.

  2. o meu gera o seguinte erro :

    Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:2.5:resources (default-resources) on project monitor: Cannot create resource output directory

    1. Olá Robson bem vindo ao blog. Esse post foi feito a 5 anos hehehe. Minha dica é conferir se você tem permissão de escrita nesse diretório se tiver então confira sua versão do Java e do Maven. Confira se nada mudou do Java 6 e Maven 3 (acho que usei essas versões para esse post) e as versões que você está usando atualmente possivelmente você precisará adaptar à sua realidade. Qualquer coisa comente aqui novamente.

  3. Quando eu tento rodar o jar com “java -jar …” encontro o seguinte erro: “Não foi possível localizar nem carregar a classe principal com.project.Application”

    A única diferença no meu projeto é que uso o plugin

    org.springframework.boot
    spring-boot-maven-plugin

    ao invés de

    org.apache.maven.plugins
    maven-compiler-plugin
    2.3.2

    1.6
    1.6

    já que meu projeto é sping boot.
    Como posso resolver esse problema?

    1. Fala Gabriel beleza!
      Nesse caso use o comando mvn clean package se quiser pular os testes use mvn clean package -DskipTests.
      Grande abraço e sucesso!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *