O Maven2 está me deixando louco durante a fase de experimentação / maquete rápida e suja do desenvolvimento.
Eu tenho um pom.xml
arquivo que define as dependências para a estrutura de aplicativos da web que eu quero usar e posso gerar rapidamente projetos iniciais a partir desse arquivo. No entanto, às vezes eu quero vincular a uma biblioteca de terceiros que ainda não tenha um pom.xml
arquivo definido, então, em vez de criar o pom.xml
arquivo para a lib de terceiros manualmente, instalá-lo e adicioná-lo à dependência pom.xml
, gostaria de para dizer ao Maven: "Além das minhas dependências definidas, inclua os frascos que também estiverem /lib
".
Parece que isso deveria ser simples, mas se for, estou perdendo alguma coisa.
Quaisquer sugestões sobre como fazer isso são muito apreciadas. Além disso, se houver uma maneira simples de apontar para um /lib
diretório e criar facilmente um pom.xml
com todos os frascos fechados mapeados para uma única dependência que eu poderia nomear / instalar e vincular de uma só vez, também seria suficiente.
Respostas:
Problemas de abordagens populares
A maioria das respostas encontradas na Internet sugere que você instale a dependência no seu repositório local ou especifique um escopo de "sistema" no
pom
e distribua a dependência com a fonte do seu projeto. Mas essas duas soluções são realmente falhas.Por que você não deve aplicar a abordagem "Instalar no repositório local"
Quando você instala uma dependência em seu repositório local, ela permanece lá. Seu artefato de distribuição funcionará bem desde que tenha acesso a este repositório. O problema é que, na maioria dos casos, esse repositório residirá em sua máquina local, portanto não haverá maneira de resolver essa dependência em qualquer outra máquina. Claramente, fazer com que seu artefato dependa de uma máquina específica não é uma maneira de lidar com as coisas. Caso contrário, essa dependência precisará ser instalada localmente em todas as máquinas que trabalham com esse projeto, o que não é melhor.
Por que você não deve aplicar a abordagem "System Scope"
Os jars dos quais você depende com a abordagem "System Scope" não são instalados em nenhum repositório ou anexados aos seus pacotes de destino. É por isso que seu pacote de distribuição não terá uma maneira de resolver essa dependência quando usado. Acredito que esse foi o motivo pelo qual o uso do escopo do sistema ficou obsoleto. De qualquer forma, você não deseja confiar em um recurso obsoleto.
A solução estática de repositório no projeto
Depois de colocar isso no seu
pom
:para cada artefato com um ID de grupo do formulário, o
x.y.z
Maven incluirá o seguinte local dentro do diretório do projeto em sua busca por artefatos:Para elaborar mais sobre isso, você pode ler esta postagem do blog .
Use o Maven para instalar para projetar repo
Em vez de criar essa estrutura manualmente, recomendo usar um plug-in Maven para instalar seus jars como artefatos. Portanto, para instalar um artefato em um repositório no projeto na
repo
pasta, execute:Se você escolher essa abordagem, poderá simplificar a declaração do repositório em
pom
:Um script auxiliar
Como executar o comando de instalação para cada biblioteca é meio irritante e definitivamente propenso a erros, eu criei um script utilitário que instala automaticamente todos os jars de uma
lib
pasta para um repositório de projetos, enquanto resolve automaticamente todos os metadados (groupId, artifactId e etc.) de nomes de arquivos. O script também imprime as dependências xml para você copiar e colar no seupom
.Inclua as dependências no seu pacote de destino
Quando você criar seu repositório no projeto, terá resolvido um problema de distribuição das dependências do projeto com sua origem, mas desde então o artefato de destino do seu projeto dependerá de jarros não publicados, portanto, quando você instalar para um repositório, ele terá dependências não resolvíveis.
Para superar esse problema, sugiro incluir essas dependências no pacote de destino. Isso você pode fazer com o Plug - in Assembly ou melhor com o Plug-in OneJar . A documentação oficial do OneJar é fácil de entender.
fonte
Apenas para jogar fora o código
defina o sistema scope == e apenas crie um groupId, artifactId e version
Nota: as dependências do sistema não são copiadas no jar / war resultante
(consulte Como incluir dependências do sistema na guerra criada usando o maven )
fonte
system
escopo é uma prática horrível que é fortemente desencorajada . Consulte Dependência + Escopos .Você pode criar um repositório local no seu projeto
Por exemplo, se você possui uma
libs
pasta na estrutura do projetoNa
libs
pasta, você deve criar uma estrutura de diretórios como:/groupId/artifactId/version/artifactId-version.jar
No seu pom.xml, você deve registrar o repositório
e adicione dependência como de costume
Isso é tudo.
Para obter informações detalhadas: Como adicionar bibliotecas externas no Maven
fonte
Nota: Ao usar o escopo do sistema ( conforme mencionado nesta página ), o Maven precisa de caminhos absolutos.
Se seus jars estiverem na raiz do seu projeto, você deverá prefixar os valores systemPath com $ {basedir}.
fonte
Isto é o que eu fiz, ele também resolve o problema do pacote e funciona com o código do check-out.
Criei uma nova pasta no projeto, no meu caso, usei
repo
, mas fique à vontade para usarsrc/repo
No meu POM, eu tinha uma dependência que não está em nenhum repositório público de máquinas
Criei os seguintes diretórios
repo/com/dovetail/zoslog4j/1.0.1
e copiei o arquivo JAR para essa pasta.Eu criei o seguinte arquivo POM para representar o arquivo baixado (esta etapa é opcional, mas remove um AVISO) e ajuda o próximo cara a descobrir onde eu peguei o arquivo.
Dois arquivos opcionais que eu crio são as somas de verificação SHA1 para o POM e o JAR para remover os avisos de soma de verificação ausentes.
Finalmente, adiciono o seguinte fragmento ao meu pom.xml, que me permite consultar o repositório local
fonte
Você realmente deve implementar uma estrutura através de um repositório e identificar suas dependências antecipadamente. Usar o escopo do sistema é um erro comum que as pessoas usam, porque "não se importam com o gerenciamento de dependências". O problema é que, ao fazer isso, você acaba com uma construção pervertida do maven que não mostrará o maven em condições normais. Você seria melhor seguir uma abordagem como esta .
fonte
É assim que adicionamos ou instalamos um jar local
Eu dei alguns groupId padrão e artifactId porque eles são obrigatórios :)
fonte
O plug - in de instalação do Maven possui uso de linha de comando para instalar um jar no repositório local; o POM é opcional, mas você precisará especificar o GroupId, ArtifactId, Version e Packaging (todos os itens do POM).
fonte
Usar
<scope>system</scope>
é uma péssima idéia por motivos explicados por outros, instalar o arquivo manualmente no repositório local torna a compilação improdutível e usar<url>file://${project.basedir}/repo</url>
também não é uma boa ideia porque (1) pode não ser umafile
URL bem formada (por exemplo, se o projeto é verificado em um diretório com caracteres incomuns), (2) o resultado é inutilizável se o POM deste projeto for usado como uma dependência do projeto de outra pessoa.Supondo que você não esteja disposto a carregar o artefato em um repositório público, a sugestão de Simeon de um módulo auxiliar faz o trabalho. Mas existe uma maneira mais fácil agora ...
A Recomendação
Use non-maven-jar-maven-plugin . Faz exatamente o que você estava pedindo, sem nenhuma das desvantagens das outras abordagens.
fonte
Eu encontrei outra maneira de fazer isso, veja aqui em um post do Heroku
Para resumir (desculpe por copiar e colar)
repo
diretório na sua pasta raiz:pom.xml
:fonte
Depois de uma longa discussão com o pessoal do CloudBees sobre o empacotamento adequado desse tipo de JARs, eles fizeram uma boa proposta interessante para uma solução:
Criação de um projeto Maven falso que anexa um JAR preexistente como um artefato primário, executando a instalação do POM pertencente: execução do arquivo install. Aqui está um exemplo desse kinf do POM:
Mas, para implementá-lo, a estrutura existente do projeto deve ser alterada. Primeiro, você deve ter em mente que, para cada tipo de JAR, deve ser criado um projeto falso diferente do Maven (módulo). E deve ser criado um projeto Maven pai, incluindo todos os submódulos que são: todos os wrappers JAR e o projeto principal existente. A estrutura pode ser:
Quando o pai executando através do mvn: install ou mvn: o empacotamento é forçado e os submódulos serão executados. Isso pode ser considerado um ponto negativo aqui, já que a estrutura do projeto deve ser alterada, mas oferece uma solução não estática no final
fonte
O que me parece mais simples é apenas configurar o plugin maven-compiler-plugin para incluir seus jars personalizados. Este exemplo carregará qualquer arquivo jar em um diretório lib.
fonte
says nothing to complile
!all classes are up to date
nothing to compile
porque não procurará*.java
mais. Você pode adicioná-los novamente usando<include>**/*.java</include>
. No entanto, nenhum sucesso para mim para os frascos #O problema
systemPath
é que os frascos das dependências não serão distribuídos pelos seus artefatos como dependências transitivas. Experimente o que eu publiquei aqui: É melhor Mavenize seus arquivos jar do projeto ou colocá-los em WEB-INF / lib?Em seguida, declare as dependências como de costume.
E leia a nota de rodapé.
fonte
Uma solução estranha que encontrei:
usando o Eclipse
Saúde, Balint
fonte
Se você deseja uma solução rápida e suja, pode fazer o seguinte (embora eu não recomende isso para nada além de projetos de teste, o maven reclamará por muito tempo que isso não é apropriado).
Adicione uma entrada de dependência para cada arquivo jar necessário, de preferência com um script perl ou algo semelhante e copie / cole-o no seu arquivo pom.
fonte
Uma solução em lote rápida e suja (com base na resposta de Alex):
libs.bat
Executá-lo como este:
libs.bat > libs.txt
. Em seguida, abralibs.txt
e copie seu conteúdo como dependências.No meu caso, eu só precisava das bibliotecas para compilar meu código, e essa solução foi a melhor para esse fim.
fonte
Mesmo que não se ajuste exatamente ao seu problema, deixarei isso aqui. Meus requisitos eram:
Vamos falar sobre (3) primeiro: apenas ter os jars em uma pasta e, de alguma forma, mesclá-los no jar final, não funcionará aqui, pois o IDE não entenderá isso. Isso significa que todas as bibliotecas precisam ser instaladas corretamente. No entanto, não quero que todos o instalem usando "mvn install-file".
No meu projeto, eu precisava de metawidget. Aqui vamos nós:
Toda vez que você tiver uma nova biblioteca, basta adicionar uma nova execução e solicitar a todos que construam o projeto novamente (você pode melhorar esse processo com hierarquias do projeto).
fonte
Para instalar o jar de terceiros que não está no repositório maven, use maven-install-plugin.
Abaixo estão as etapas:
Abaixo está o exemplo que usei para o simonsite log4j
No pom.xml, inclua a dependência conforme abaixo
Execute o comando mvn clean install para criar sua embalagem
Abaixo está o link de referência:
https://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html
fonte
Para aqueles que não encontraram uma boa resposta aqui, é isso que estamos fazendo para obter um jar com todas as dependências necessárias. Esta resposta ( https://stackoverflow.com/a/7623805/1084306 ) menciona o uso do plug-in Maven Assembly, mas na verdade não fornece um exemplo na resposta. E se você não ler todo o caminho até o final da resposta (é bastante demorado), poderá perder. Adicionar o seguinte ao seu pom.xml irá gerar
target/${PROJECT_NAME}-${VERSION}-jar-with-dependencies.jar
fonte
Eu aludi a algum código python em um comentário à resposta do @alex lehmann's, então estou postando aqui.
fonte
Isso não responde como adicioná-los ao seu POM, e pode ser um acéfalo, mas apenas adicionaria o diretório lib ao seu trabalho de caminho de classe? Sei que é isso que faço quando preciso de um jar externo que não queira adicionar aos meus repositórios do Maven.
Espero que isto ajude.
fonte
O que funciona em nosso projeto é o que Archimedes Trajano escreveu, mas tínhamos em .m2 / settings.xml algo como isto:
e o * deve ser alterado para central. Portanto, se a resposta dele não funcionar para você, verifique suas configurações.xml
fonte
Eu só queria uma solução rápida e suja ... Não consegui executar o script de Nikita Volkov: erro de sintaxe + requer um formato estrito para os nomes dos jar.
Eu criei esse script Perl que funciona com qualquer formato para os nomes de arquivos jar e gera as dependências em um xml para que possa ser copiado e colado diretamente em um pom.
Se você deseja usá-lo, certifique-se de entender o que o script está fazendo, talvez seja necessário alterar a
lib
pasta e o valor para ogroupId
ouartifactId
...fonte
A solução para a abordagem scope = 'system' em Java:
fonte