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</source>
                    <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.

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

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