Maven: Como incluir jars, que não estão disponíveis em representantes em um projeto J2EE?

100

em meu projeto J2EE, tenho algumas dependências, que não estão disponíveis em nenhum repositório Maven, porque são bibliotecas proprietárias. Essas bibliotecas precisam estar disponíveis em tempo de execução, portanto, devem ser copiadas para o destino /.../ WEB-INF / lib ...

No momento, estou listando-os como dependência do sistema em meu POM, mas com esse método o problema é que eles não estão sendo copiados para a compilação de destino durante a compilação. Além disso, este método não é muito elegante.

Então qual a melhor forma de integrá-los no Maven?

Observação: não quero criar meu próprio repositório Maven.

Sansão
fonte
7
Eu realmente acho que você deve revisar sua decisão de criar um repositório Maven. Não é nada difícil e vale 100% a pena.
Robert Munteanu
7
O valor de criar um repositório Maven depende das circunstâncias.
yincrash de

Respostas:

54

Como você disse que não deseja configurar seu próprio repositório, talvez isso ajude.

Você pode usar o objetivo install-file do maven-install-plugin para instalar um arquivo no repositório local. Se você criar um script com uma invocação Maven para cada arquivo e mantê-lo junto com os jars, você (e qualquer outra pessoa com acesso) pode instalar facilmente os jars (e os arquivos pom associados) em seu repositório local.

Por exemplo:

mvn install:install-file -Dfile=/usr/jars/foo.jar -DpomFile=/usr/jars/foo.pom
mvn install:install-file -Dfile=/usr/jars/bar.jar -DpomFile=/usr/jars/bar.pom

ou apenas

mvn install:install-file -Dfile=ojdbc14.jar -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=10.2.0 -Dpackaging=jar

Você pode então fazer referência às dependências normalmente em seu projeto.

No entanto, sua melhor aposta ainda é configurar um repositório remoto interno e eu recomendo usar o Nexus . Ele pode ser executado em sua caixa de desenvolvimento, se necessário, e a sobrecarga é mínima.

Vendedor rico
fonte
1
Obrigado, este método está funcionando bem para mim agora. Estendi o POM para que os arquivos sejam instalados automaticamente no representante local: pastebin.ca/1504318
samson
Fico feliz em ajudar, mas como outros disseram, a melhor abordagem seria usar um gerenciador de repositório Maven. Esta abordagem não se adapta bem.
Rich Seller
4
O comando que funcionou para mim: "mvn install: install-file -Dfile = cassandra-jdbc-1.1.1.jar -DgroupId = org.apache-extras.cassandra-jdbc -DartifactId = cassandra-jdbc -Dversion = 1.1.1 -Dpackaging = jar "
Mazrick
193

Para pessoas que desejam uma solução rápida para este problema:

<dependency>
  <groupId>LIB_NAME</groupId>
  <artifactId>LIB_NAME</artifactId>
  <version>1.0.0</version>
  <scope>system</scope>
  <systemPath>${basedir}/WebContent/WEB-INF/lib/YOUR_LIB.jar</systemPath>
</dependency>

apenas forneça à sua biblioteca um groupID e nome de artefato exclusivos e aponte para onde ele está no sistema de arquivos. Você está pronto para ir.

Claro que esta é uma solução rápida suja que funcionará SOMENTE em sua máquina e se você não alterar o caminho para as libs. Mas às vezes, é tudo o que você quer, executar e fazer alguns testes.

EDIT: acabei de refazer a pergunta e percebi que o usuário já estava usando minha solução como uma correção temporária. Vou deixar minha resposta como uma ajuda rápida para outras pessoas que vierem a esta pergunta. Se alguém discordar disso, deixe-me um comentário. :)

Ric Jafe
fonte
4
Legal. Existe uma maneira de especificar um URL em vez de um caminho de máquina local?
phreakhead
3
Obrigado por um exemplo completo e funcional !!! Espero que você pegue um peixe dourado e isso lhe conceda três desejos. :)
johndodo
14
Esta deve ser a resposta aceita, pois é independente (em pom.xml)
Vikram
2
Olá, Rajarshee, os ids do grupo e do artefato são completamente arbitrários. O caminho para o seu jar no sistema de arquivos é tudo o que importa para que isso funcione. Como na realidade o jarro não é uma dependência de maven, você está apenas dizendo a Maven para tratá-lo como tal.
Ric Jafe,
1
Em 2016, isso não parecia funcionar. A construção reconhece o caminho, mas não inclui o código no jar sombreado. Ratos ...
markthegrea 01 de
24

Crie uma pasta de repositório em seu projeto. Vamos levar

${project.basedir}/src/main/resources/repo

Em seguida, instale seu jar personalizado neste repo:

mvn install:install-file -Dfile=[FILE_PATH] \
-DgroupId=[GROUP] -DartifactId=[ARTIFACT] -Dversion=[VERS] \ 
-Dpackaging=jar -DlocalRepositoryPath=[REPO_DIR]

Por último, adicione as seguintes definições de repositório e dependência ao projeto pom.xml:

<repositories>
    <repository>
        <id>project-repo</id>
        <url>file://${project.basedir}/src/main/resources/repo</url>
    </repository>
</repositories>

<dependencies>    
    <dependency>
        <groupId>[GROUP]</groupId>
        <artifactId>[ARTIFACT]</artifactId>
        <version>[VERS]</version>
    </dependency>
</dependencies>
Mostar
fonte
1
Isso funcionou muito bem para mim. PS Eu recomendaria um diretório diferente para o repositório local, pois colocá-lo dentro de "src" não parecia certo (não é a fonte!)
davidfrancis
1
Funcionou como um encanto. Estou migrando um projeto antigo do Ant para o Maven e existem algumas bibliotecas que não consigo encontrar nos repositórios da web.
Paulo Pedroso
Cuidado: quando o valor para -DlocalRepositoryPath não termina em /(ou seja, indicando uma pasta), o repo é criado com groupId. Ex: se o id do grupo for foo.come localRepositoryPath for repo, a pasta repo se tornará repo.foo.com.
Sheshadri Mantha
Este procedimento é como um projeto local para gerenciamento de repositório do sistema usando a ferramenta de automação de construção maven usada principalmente para projetos Java e o sistema de arquivos.
Oleksii Kyslytsyn
8

Você precisa configurar um repositório local que hospedará essas bibliotecas. Existem vários projetos que fazem exatamente isso. Por exemplo Artifactory .

Gregory Mostizky
fonte
4
Um ponto sobre a terminologia, esses são repositórios remotos internos, não repositórios locais. O repositório local é aquele no qual as dependências do sistema de arquivos local são baixadas.
Vendedor rico em
3

Nenhuma das soluções funciona se você estiver usando o Jenkins build !! Quando o pom é executado dentro do servidor de compilação Jenkins .. essas soluções irão falhar, pois o pom do Jenkins irá tentar baixar esses arquivos do repositório corporativo.

Copie os jars em src / main / resources / lib (crie a pasta lib). Eles farão parte do seu projeto e irão até o servidor de implantação. No servidor de implantação, certifique-se de que seus scripts de inicialização contenham src / main / resources / lib / * no classpath. Viola.

Apurva Singh
fonte
2

você pode instalá-los em um repositório local privado (por exemplo .m2 / repositório em seu diretório inicial): mais detalhes aqui

dfa
fonte
7
Sim, eu poderia fazer isso, mas então teria que dizer a todos que desejam construir o projeto que eles devem colocar os arquivos X, Y no diretório Z e isso realmente complica as coisas. Afinal, quero usar o Maven para simplificar o processo de construção.
samson
2

Se eu estou entendendo bem, se o que você quer fazer é exportar dependências durante a fase de compilação para que não haja necessidade de recuperar manualmente cada biblioteca necessária, você pode usar o mojo copy-dependencies .

Espero que possa ser útil no seu caso ( exemplos )

Erik Clairiot
fonte
2

A solução da @Ric Jafe é o que funcionou para mim.

Isso é exatamente o que eu estava procurando. Uma maneira de enviá-lo para o código de teste de pesquisa. Nada chique. Sim, eu sei que isso é o que todos dizem :) As várias soluções de plug-ins do maven parecem ser exageradas para meus propósitos. Eu tenho alguns jars que foram dados a mim como libs de terceiros com um arquivo pom. Eu quero que ele compile / execute rapidamente. Esta solução que eu adaptei trivialmente para Python fez maravilhas para mim. Recortado e colado no meu pom. O código Python / Perl para esta tarefa está neste Q&A: Posso adicionar jars ao maven 2 build classpath sem instalá-los?

def AddJars(jarList):
  s1 = ''
  for elem in jarList:
   s1+= """
     <dependency>
        <groupId>local.dummy</groupId>
        <artifactId>%s</artifactId>
        <version>0.0.1</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/manual_jars/%s</systemPath>
     </dependency>\n"""%(elem, elem)
  return s1
Paulo
fonte
A solução acima retorna 'dependencies.dependency.systemPath' para xx.jar não deve apontar para arquivos dentro do diretório do projeto. Consulte stackoverflow.com/questions/10935135/…
sarah.ferguson
1

Instalar sozinho não funcionou para mim.

mvn deploy:deploy-file -Durl=file:///home/me/project/lib/ \
  -Dfile=target/jzmq-2.1.3-SNAPSHOT.jar -DgroupId=org.zeromq \  
  -DartifactId=zeromq -Dpackaging=jar -Dversion=2.1.3
Jonathan Hendler
fonte