Maven: adicionar uma dependência a um jarro por caminho relativo

Eu tenho um jarro proprietário que eu quero adicionar ao meu pom como uma dependência.

Mas eu não quero adicioná-lo a um repository. A razão é que eu quero que meus comandos comuns do maven, como mvn compile , etc, funcionem fora da checkbox. (Sem exigir dos desenvolvedores um para adicioná-lo a algum repository por si só).

Eu quero o jar para estar em um 3rdparty lib no controle de origem e vinculá-lo por caminho relativo do arquivo pom.xml.

Isso pode ser feito? Como?

Eu quero o jar para estar em um 3rdparty lib no controle de origem e vinculá-lo por caminho relativo do arquivo pom.xml.

Se você realmente quer isso (entenda, se você não pode usar um repository corporativo), então meu conselho seria usar um “repository de arquivos” local para o projeto e não usar uma dependência com escopo de system . O escopo do system deve ser evitado, tais dependencies não funcionam bem em muitas situações (por exemplo, na assembly), elas causam mais problemas do que benefícios.

Então, em vez disso, declare um repository local para o projeto:

   my-local-repo file://${basedir}/my-repo   

Instale sua biblioteca de terceiros lá usando install:install-file com o parâmetro localRepositoryPath :

 mvn install:install-file -Dfile= -DgroupId= \ -DartifactId= -Dversion= \ -Dpackaging= -DlocalRepositoryPath= 

Atualização: Parece que install:install-file ignora o localRepositoryPath ao usar a versão 2.2 do plugin. No entanto, funciona com a versão 2.3 e posterior do plugin. Portanto, use o nome completo do plugin para especificar a versão:

 mvn org.apache.maven.plugins:maven-install-plugin:2.3.1:install-file \ -Dfile= -DgroupId= \ -DartifactId= -Dversion= \ -Dpackaging= -DlocalRepositoryPath= 

documentação do maven-install-plugin

Finalmente, declare como qualquer outra dependência (mas sem o escopo do system ):

  your.group.id 3rdparty XYZ  

Esta é uma solução melhor para IMHO do que usar um escopo de system pois sua dependência será tratada como um bom cidadão (por exemplo, ele será incluído em uma assembly e assim por diante).

Agora, devo mencionar que o “caminho certo” para lidar com essa situação em um ambiente corporativo (talvez não seja o caso aqui) seria usar um repository corporativo.

Usando o escopo do system . ${basedir} é o diretório do seu pom.

  .. .. system ${basedir}/lib/dependency.jar  

No entanto, é aconselhável que você instale seu jar no repository e não o submeta ao SCM – afinal, é isso que o maven tenta eliminar.

Esse é outro método além da minha resposta anterior em Posso adicionar jars ao maven 2 build classpath sem instalá-los?

Isso contornará o limite ao usar compilações multimódulos, especialmente se o JAR baixado for mencionado em projetos filhos fora do pai. Isso também reduz o trabalho de configuração, criando o POM e os arquivos SHA1 como parte da construção. Ele também permite que o arquivo resida em qualquer parte do projeto sem corrigir os nomes ou seguir a estrutura do repository maven.

Isso usa o maven-install-plugin. Para que isso funcione, você precisa configurar um projeto de vários módulos e ter um novo projeto que represente a construção para instalar arquivos no repository local e garantir que ele seja o primeiro.

Seu projeto multi-módulo pom.xml ficaria assim:

 pom   repository ... other modules ...  

O arquivo repository / pom.xml conterá as definições para carregar os JARs que fazem parte do seu projeto. A seguir estão alguns trechos do arquivo pom.xml.

 repository pom 

O empacotamento do pom impede que ele faça qualquer teste ou compile ou gere qualquer arquivo jar. A carne do pom.xml está na seção de construção onde o plugin maven-install é usado.

    org.apache.maven.plugins maven-install-plugin   com.ibm.db2:db2jcc verify  install-file   com.ibm.db2 db2jcc 9.0.0 jar ${basedir}/src/jars/db2jcc.jar true true   ...     

Para instalar mais de um arquivo, basta adicionar mais execuções.

Eu já escrevi anteriormente sobre um padrão para fazer isso.

É muito semelhante à solução proposta por Pascal, embora mova todas essas dependencies para um módulo de repository dedicado, para que você não precise repeti-lo em todos os lugares onde a dependência é usada, se for uma compilation de vários módulos.

Isso está funcionando para mim: digamos que eu tenha essa dependência

  com.company.app my-library 1.0 system ${project.basedir}/lib/my-library.jar  

Em seguida, adicione o caminho de class para a dependência do sistema manualmente, assim

 libs/my-library-1.0.jar 

Configuração completa:

  org.apache.maven.plugins maven-jar-plugin 2.4    ${jdk.version} ${project.name} ${project.version} ${project.name} Library ${project.version} libs/my-library-1.0.jar   true com.company.app.MainClass libs/      org.apache.maven.plugins maven-dependency-plugin 2.5.1   copy-dependencies package  copy-dependencies   ${project.build.directory}/libs/     

Basicamente, adicione isso ao pom.xml:

 ...   lib_id file://${project.basedir}/lib   ...  ...  com.mylibrary mylibraryname 1.0.0  ...  

nós mudamos para gradle e isso funciona muito melhor no gradle;). nós apenas especificamos uma pasta onde podemos colocar jars em situações temporárias como essa. Ainda temos a maioria de nossos flasks definidos na seção típica de gerenciamento de dependencies (ou seja, o mesmo que maven). Esta é apenas mais uma dependência que definimos.

Então, basicamente, agora podemos simplesmente soltar qualquer jar que quisermos em nosso diretório lib para testes temporários se não for um repository in maven em algum lugar.

Uma pequena adição à solução postada por Pascal

Quando segui esse caminho, recebi um erro no maven durante a instalação do jar do ojdbc.

 [INFO] --- maven-install-plugin:2.5.1:install-file (default-cli) @ validator --- [INFO] pom.xml not found in ojdbc14.jar 

Depois de adicionar -DpomFile, o problema foi resolvido.

 $ mvn install:install-file -Dfile=./lib/ojdbc14.jar -DgroupId=ojdbc \ -DartifactId=ojdbc -Dversion=14 -Dpackaging=jar -DlocalRepositoryPath=./repo \ -DpomFile=~/.m2/repository/ojdbc/ojdbc/14/ojdbc-14.pom 

Você pode usar o eclipse para gerar um arquivo Jar: Export / Runable Jar executável