Maven: Temsilcilerde bulunmayan kavanozları bir J2EE projesine nasıl dahil edebilirim?


100

J2EE projemde, özel kütüphaneler oldukları için hiçbir Maven deposunda bulunmayan birkaç bağımlılığım var. Bu kitaplıkların çalışma zamanında mevcut olması gerekir, böylece hedef /.../ WEB-INF / lib ... hedefine kopyalanmalıdır.

Şu anda, bunları POM'umda sistem bağımlılığı olarak listeliyorum, ancak bu yöntemle sorun şu ki, derleme sırasında hedef yapıya kopyalanmıyor. Ayrıca bu yöntem çok şık değil.

Peki onları Maven'e entegre etmenin en iyi yolu nedir?

Not: Kendi Maven depomu oluşturmak istemiyorum.


7
Ben gerçekten bir Maven depo yaratma kararınızı gözden geçirmelidir düşünüyorum. Hiç zor değil ve% 100 buna değer.
Robert Munteanu

7
Bir Maven deposu oluşturmanın değeri koşullara bağlıdır.
yincrash

Yanıtlar:


54

Kendi deponuzu kurmak istemediğinizi söylediğiniz gibi, belki bu yardımcı olacaktır.

Yerel depoya bir dosya yüklemek için maven-install-eklentisinin yükleme dosyası hedefini kullanabilirsiniz . Her dosya için Maven çağrısı içeren bir komut dosyası oluşturur ve bunu kavanozların yanında saklarsanız, siz (ve erişimi olan herhangi biri) kavanozları (ve ilişkili pom dosyalarını) yerel depolarına kolayca yükleyebilirsiniz.

Örneğin:

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

ya da sadece

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

Daha sonra projenizde normal olarak bağımlılıklara başvurabilirsiniz.

Yine de en iyi seçeneğiniz, dahili bir uzak depo kurmaktır ve Nexus'u kendim kullanmanızı tavsiye ederim. Gerekirse geliştirme kutunuzda çalışabilir ve ek yük minimum düzeydedir.


1
Teşekkürler bu yöntem şu anda benim için iyi çalışıyor. POM'u, dosyalar otomatik olarak yerel temsilciye yüklenecek şekilde genişlettim: pastebin.ca/1504318
samson

Yardımcı olmaktan memnunum, ancak diğerlerinin de söylediği gibi, en iyi yaklaşım bir Maven depo yöneticisi kullanmaktır. Bu yaklaşım iyi ölçeklenmiyor.
Rich Seller

4
Benim için çalışan komut: "mvn install: install-file -Dfile = cassandra-jdbc-1.1.1.jar -DgroupId = org.apache-extras.cassandra-jdbc -DartifactId = cassandra-jdbc -Dversion = 1.1.1 -Paketleme = kavanoz "
Mazrick

193

Bu soruna hızlı bir çözüm arayan kişiler için:

<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>

kitaplığınıza benzersiz bir groupID ve yapı adı verin ve dosya sisteminde nerede olduğunu gösterin. Senin gitmen iyidir.

Elbette bu, YALNIZCA makinenizde ve kitaplıklara giden yolu değiştirmezseniz işe yarayacak kirli bir hızlı çözümdür. Ama bazen, tüm istediğin bu, koşup birkaç test yapmak.

DÜZENLEME: sadece soruyu yeniden yazın ve kullanıcının zaten benim çözümümü geçici bir düzeltme olarak kullandığını fark ettim. Cevabımı bu soruya gelen diğerlerine hızlı bir yardım olarak bırakacağım. Birisi buna katılmazsa lütfen bana bir yorum bırakın. :)


4
Güzel. Yerel makine yolu yerine bir URL belirtmenin bir yolu var mı?
phreakhead

3
Eksiksiz ve çalışan bir örnek için teşekkürler !!! Umarım altın bir balık yakalarsın ve bu sana üç dilek verir. :)
johndodo

14
Kendi kendine yeten (pom.xml içinde) olduğu için kabul edilen cevap bu olmalıdır
Vikram

2
Merhaba Rajarshee, grup ve eser kimlikleri tamamen keyfi. Dosya sistemindeki kavanozunuzun yolu, bunun çalışması için önemli olan tek şeydir. Çünkü gerçekte kavanoz bir maven bağımlılığı değildir, sadece Maven'e ona bir tane gibi davranmasını söylüyorsunuz.
Ric Jafe

1
2016 itibariyle bu işe yaramıyor gibi görünüyor. Yapı yolu onaylar ancak gölgeli kavanozdaki kodu içermez. Sıçanlar ...
markthegrea

24

Projenizin altında bir depo klasörü oluşturun. Hadi alalım

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

Ardından, özel kavanozunuzu bu depoya yükleyin:

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

Son olarak, aşağıdaki repo ve bağımlılık tanımlarını pom.xml projelerine ekleyin:

<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>

1
Bu benim için çok iyi çalıştı. Not: "src" içine koymak doğru görünmediği için yerel depo için farklı bir dizin öneririm (bu kaynak değil!)
davidfrancis

1
Büyüleyici çalıştı. Eski bir projeyi Ant'tan Maven'e geçiriyorum ve web depolarında bulamadığım birkaç kitap var.
Paulo Pedroso

Dikkat: -DlocalRepositoryPath değeri ile bitmediğinde /(yani, bir klasör belirtildiğinde), o zaman depo groupId ile oluşturulur. Ör: grup kimliği foo.comve localRepositoryPath ise repo, depo klasörü olur repo.foo.com.
Sheshadri Mantha

Bu prosedür, öncelikli olarak Java projeleri ve dosya sistemi için kullanılan maven derleme otomasyon aracını kullanan yerel sistem depo yönetimi için bir proje gibidir.
Oleksii Kyslytsyn

8

Bu tür kitaplıkları barındıracak yerel bir depo kurmanız gerekir. Tam olarak bunu yapan birkaç proje var. Örneğin Artifactory .


4
Terminoloji üzerine bir nokta, bunlar dahili uzak depolar, yerel depolar değil. Yerel depo, yerel dosya sistemi bağımlılıklarının indirildiği yerdir.
Rich Seller

3

Jenkins build kullanıyorsanız çözümlerin hiçbiri işe yaramıyor !! Pom, Jenkins derleme sunucusunda çalıştırıldığında .. bu çözümler başarısız olur, çünkü Jenkins çalıştırdığında pom bu dosyaları kurumsal depodan indirmeye çalışacaktır.

Src / main / resources / lib (lib klasörü oluştur) altına kavanozları kopyalayın. Bunlar projenizin bir parçası olacak ve dağıtım sunucusuna kadar gidecek. Dağıtım sunucusunda, başlangıç ​​komut dosyalarınızın sınıf yolunda src / main / resources / lib / * içerdiğinden emin olun. Viyola.


2

bunları özel, yerel bir depoya kurabilirsiniz (örn. ana dizininizin altındaki .m2 / depo): daha fazla ayrıntı burada


7
Evet bunu yapabilirdim, ama o zaman projeyi inşa etmek isteyen herkese X, Y dosyalarını Z dizinine koyması gerektiğini ve bu işleri gerçekten karmaşıklaştırdığını söylemem gerekir. Sonuçta, inşa sürecini basitleştirmek için Maven'ı kullanmak istiyorum.
samson


2

@Ric Jafe'nin çözümü benim için işe yarayan şeydi.

Bu tam olarak aradığım şeydi. Araştırma testi kodu için zorlamanın bir yolu. Süslü bir şey yok. Evet, hepsinin söylediği şeyin bu olduğunu biliyorum :) Çeşitli maven eklenti çözümleri benim amaçlarım için aşırıya kaçıyor gibi görünüyor. Bana bir pom dosyasıyla 3. parti kitaplıklar olarak verilen bazı kavanozlarım var. Hızlı bir şekilde derlenmesini / çalıştırılmasını istiyorum. Python'a özel olarak uyarladığım bu çözüm benim için harikalar yarattı. Kesip ponponuma yapıştırdım. Bu görev için Python / Perl kodu bu Soru ve Cevap bölümündedir: maven 2 derleme sınıfyoluna, yüklemeden kavanoz ekleyebilir miyim?

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

Yukarıdaki çözüm, xx.jar için 'dependencies.dependency.systemPath' döndürür, proje dizinindeki dosyalara işaret etmemelidir. Stackoverflow.com/questions/10935135/… sayfasına
sarah.ferguson


1

Tek başına yüklemek benim için işe yaramadı.

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.