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.
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.
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
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?
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.
Qual comando você utilizou para montar ele no maven?(install, package, assembly?)
mvn clean install só olhar a pasta target que o jar estará lá.
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
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.
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?
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!