Maven e JARs locais: 5 erros fatais e suas soluções

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Por que "apenas copiar o JAR para a pasta" não funciona?

\n\n

Todo desenvolvedor Java que já lidou com Maven, mais cedo ou mais tarde, encontra uma barreira: "Preciso conectar uma biblioteca antiga que não está no Maven Central. O que fazer?". Você pesquisa, encontra uma pergunta no Stack Overflow com milhares de visualizações, tenta o primeiro conselho — e recebe um ClassNotFoundException ou Missing artifact.

\n\n

Familiar? Neste artigo, vamos analisar os principais erros ao adicionar arquivos JAR locais em um projeto Maven e, principalmente, como evitá-los. Você aprenderá não apenas a teoria, mas também verá código funcional que pode aplicar imediatamente no seu projeto Java.

\n\n

Erro nº1: System scope sem systemPath

\n\n

A armadilha mais comum para iniciantes — adicionar uma dependência com <scope>system</scope>, mas esquecer de especificar <systemPath>. O Maven tenta honestamente encontrar o JAR, mas não sabe onde ele está.

\n\n

Como o erro se apresenta

\n
[ERROR] Failed to execute goal on project my-app: \nCould not resolve dependencies for project com.example:my-app:jar:1.0: \nThe following artifacts could not be resolved: \ncom.example:my-custom-lib:jar:1.0 (absent)
\n\n

Código incorreto

\n
<dependency>\n    <groupId>com.example</groupId>\n    <artifactId>my-custom-lib</artifactId>\n    <version>1.0</version>\n    <scope>system</scope>\n    <!-- systemPath ausente! -->\n</dependency>
\n\n

Solução correta

\n

Sempre especifique o caminho completo para o arquivo JAR através de <systemPath>. É recomendável usar um caminho relativo a partir da raiz do projeto, para não depender de uma máquina de desenvolvedor específica.

\n\n
<dependency>\n    <groupId>com.example</groupId>\n    <artifactId>my-custom-lib</artifactId>\n    <version>1.0</version>\n    <scope>system</scope>\n    <systemPath>${project.basedir}/libs/my-custom-lib-1.0.jar</systemPath>\n</dependency>
\n\n

Importante: O arquivo JAR deve estar na pasta libs/ dentro do seu projeto. Crie-a se ainda não o fez.

\n\n

Erro nº2: Esqueceu do install-file para projetos multimódulo

\n\n

Suponha que você adicionou um JAR local via system scope, e tudo funciona localmente. Mas quando tenta compilar o projeto no servidor CI (Jenkins, GitLab CI) — a compilação falha. Por quê? Porque o system scope não é transmitido transitivamente e não entra no repositório local do Maven.

\n\n

Abordagem correta: instalar o JAR no repositório local

\n

Use o comando mvn install:install-file. Isso adicionará seu JAR em ~/.m2/repository, e ele ficará disponível para todos os módulos do projeto e para compilações CI.

\n\n
mvn install:install-file \\\n   -Dfile=libs/my-custom-lib-1.0.jar \\\n   -DgroupId=com.example \\\n   -DartifactId=my-custom-lib \\\n   -Dversion=1.0 \\\n   -Dpackaging=jar \\\n   -DgeneratePom=true
\n\n

Depois disso, no pom.xml você pode especificar uma dependência normal sem systemPath:

\n\n
<dependency>\n    <groupId>com.example</groupId>\n    <artifactId>my-custom-lib</artifactId>\n    <version>1.0</version>\n</dependency>
\n\n

Erro nº3: Uso de URL file:// em repositórios

\n\n

Alguns desenvolvedores tentam "enganar" o Maven adicionando uma pasta local como repositório através de <repository> com URL file://. Tecnicamente funciona, mas cria vários problemas:

\n\n
    \n
  • Não portabilidade: o caminho /home/user/project/libs não funcionará em outra máquina.
  • \n
  • Confusão com versões:
  • \n

Blogs

Book Recommendations