Maven: bir kavanoza göreli yolla bağımlılık ekleyin


232

Bir bağımlılık olarak pom'a eklemek istediğim özel bir kavanoz var.

Ama bunu bir depoya eklemek istemiyorum. Bunun sebebi mvn compile, vs gibi her zamanki maven komutlarımın kutudan çıkmasını istiyorum. (Geliştiricilerden talep etmeden, kendi başlarına bazı depolara eklemeleri).

Kavanozun kaynak denetiminde 3. parti bir lib'de olmasını ve pom.xml dosyasından göreli yolla bağlantı kurmasını istiyorum.

Bu yapılabilir mi? Nasıl?

Yanıtlar:


343

Kavanozun kaynak denetiminde 3. parti bir lib'de olmasını ve pom.xml dosyasından göreli yolla bağlantı kurmasını istiyorum.

Bunu gerçekten istiyorsanız (anlayın, bir şirket deposunu kullanamıyorsanız), tavsiyem projenin yerelinde bir "dosya deposu" kullanmak ve systemkapsamlı bir bağımlılık kullanmamak olacaktır . systemKapsamına sahip (örneğin montaj olarak) bu tür bağımlılıkları birçok durumda iyi çalışmayan kaçınılmalıdır, bunlar faydadan çok sorunlara neden olmaktadır.

Bunun yerine, projeye yerel bir depo bildirin:

<repositories>
  <repository>
    <id>my-local-repo</id>
    <url>file://${project.basedir}/my-repo</url>
  </repository>
</repositories>

Üçüncü taraf lib'inizi install:install-fileşu localRepositoryPathparametreyle oraya kurun :

mvn install:install-file -Dfile=<path-to-file> -DgroupId=<myGroup> \ 
                         -DartifactId=<myArtifactId> -Dversion=<myVersion> \
                         -Dpackaging=<myPackaging> -DlocalRepositoryPath=<path>

Güncelleme: O anlaşılmaktadır install:install-filegörmezden localRepositoryPathEklentinin sürüm 2.2 kullanırken. Ancak, eklentinin 2.3 ve sonraki sürümleriyle çalışır. Sürümü belirtmek için eklentinin tam adını kullanın:

mvn org.apache.maven.plugins:maven-install-plugin:2.3.1:install-file \
                         -Dfile=<path-to-file> -DgroupId=<myGroup> \ 
                         -DartifactId=<myArtifactId> -Dversion=<myVersion> \
                         -Dpackaging=<myPackaging> -DlocalRepositoryPath=<path>

maven-install-plugin belgeleri

Son olarak, başka bir bağımlılık gibi ilan edin (ancak systemkapsamı olmadan ):

<dependency>
  <groupId>your.group.id</groupId>
  <artifactId>3rdparty</artifactId>
  <version>X.Y.Z</version>
</dependency>

Bu, IMHO'nun bir systemkapsamı kullanmaktan daha iyi bir çözümdür, çünkü bağımlılığınız iyi bir vatandaş gibi muamele görecektir (örneğin bir meclise dahil edilecektir).

Şimdi, bu durumla kurumsal bir ortamda (belki de durum böyle değil) başa çıkmanın "doğru yolunun" kurumsal bir depo kullanmak olacağını belirtmeliyim.


2
Bu harika bir fikir, ancak Maven 2.2.1'de kurulum eklentisi görmezden geliyor gibi görünüyor localRepositoryPath...
Jake

1
Neden yerel bir repo ilan etmelisiniz? Neden sadece geri kalanı ile ~ / .m2 / içine girmesine izin vermiyoruz.
Leif Gruenwoldt

6
@ leif81 Çünkü o zaman repo ve kütüphaneler SCM deposuna kontrol edilir -> Kaynak çıkış yapan herkes kütüphanenin / uygulamanın bir kopyasını oluşturmak için gereken her şeye sahiptir.
Darth Android

6
@Lemon ile aynı problemi yaşadım, bunun yerine basedir/./my-local-repotek bir şeyle yaptım ..
Brian

2
Ambalaj kavanoz olmalı, bu nedenle -Ambalaj = kavanoz
Danila Piatov

127

systemKapsamı kullanma . ${basedir}pom'unuzun dizinidir.

<dependency>
    <artifactId>..</artifactId>
    <groupId>..</groupId>
    <scope>system</scope>
    <systemPath>${basedir}/lib/dependency.jar</systemPath>
</dependency>

Bununla birlikte, kavanozunuzu depoya kurmanız ve SCM'ye taahhüt etmemeniz önerilir - sonuçta maven ortadan kaldırmaya çalışır.


15
Kapsam sisteminden mümkün olduğunca kaçınılmalıdır.
JAR'ı

14
evet, mümkünse. açıkça depoya koymak istemediğini söyledi. Bunun iyi bir uygulama olmadığını belirtmek için bir yorum ekledim. Ama işe yarıyor.
Bozho

groovy, çözüm şimdiye kadar en kabul edilebilir olduğunu sanırım .. Ben tamamen soruyu yanlış okudum
karınca

Evet - sorunun kendisi en iyi cevabı içermez. Her şeyi tek kaynak kontrol sunucunuza koymak , "kutunun dışına çıkmak" ile pek bir ilgisi yoktur; daha ziyade her şeyin "kontrol edilmesi" gerekir. Check-in pom's & settings.xml ( dahili repoya işaret ederek ) yapın ve projeniz için iki sunucu kullanın : (1) kaynak kontrolü, (2) üretilen artefakt kontrolü. Dll's (benim eski corp aslında check-in kavanozlar & lib.a / .so / .dll's kontrol yaptığı gibi kavanozlarda kontrol kadar mantıklı yapar. Günlük çalışma Sorun çözüldü mü?
michael

bunun yerine kavanoz içeren bir dizin belirtmek için herhangi bir yolu böylece 'her biri her biri bunu yapmak gibi her şeyi eklemek zorunda değilsiniz?
Dean Hiller

29

Bu benim önceki cevabımın yanı sıra başka bir yöntem. 2 derleme sınıf yolunu kurmadan maven ekleyebilir miyim?

Özellikle indirilen JAR'a üst öğenin dışındaki alt projelerde başvuru yapılıyorsa, çok modüllü derlemeler kullanılırken bu sınır aşılır. Bu, yapının bir parçası olarak POM ve SHA1 dosyalarını oluşturarak kurulum işini de azaltır. Ayrıca, dosyanın adları düzeltmeden veya maven depo yapısını takip etmeden projenin herhangi bir yerinde bulunmasına izin verir.

Bu, maven-install-eklentisini kullanır. Bunun çalışması için, çok modüllü bir proje kurmanız ve dosyaları yerel depoya yüklemek ve önce bir tane olmasını sağlamak için derlemeyi temsil eden yeni bir projeniz olması gerekir.

Çok modüllü pom.xml projeniz şöyle görünecektir:

<packaging>pom</packaging>
<modules>
<!-- The repository module must be first in order to ensure
     that the local repository is populated -->
    <module>repository</module>
    <module>... other modules ...</module>
</modules>

Depo / pom.xml dosyası, projenizin bir parçası olan JAR'ları yüklemek için tanımları içerir. Pom.xml dosyasının bazı parçacıkları aşağıdadır.

<artifactId>repository</artifactId>
<packaging>pom</packaging>

Pom paketleme, bunun herhangi bir test yapmasını veya herhangi bir kavanoz dosyası derlemesini veya oluşturmasını önler. Pom.xml'nin eti, maven-install-eklentisinin kullanıldığı inşa bölümünde bulunur.

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
            <executions>
                <execution>
                        <id>com.ibm.db2:db2jcc</id>
                        <phase>verify</phase>
                        <goals>
                            <goal>install-file</goal>
                        </goals>
                        <configuration>
                            <groupId>com.ibm.db2</groupId>
                            <artifactId>db2jcc</artifactId>
                            <version>9.0.0</version>
                            <packaging>jar</packaging>
                            <file>${basedir}/src/jars/db2jcc.jar</file>
                            <createChecksum>true</createChecksum>
                            <generatePom>true</generatePom>
                        </configuration>
                </execution>
                <execution>...</execution>
            </executions>
        </plugin>
    </plugins>
</build>

Birden fazla dosya yüklemek için daha fazla yürütme eklemeniz yeterlidir.


Çok modüllü projem için işe yarayan tek şey bu. Bilinmeyen bir nedenden ötürü yerel <repository> yaklaşımı işe yaramadı. Çok teşekkürler!
Lonzak

10

Bu benim için çalışıyor: Diyelim ki bu bağımlılığım var

<dependency>
    <groupId>com.company.app</groupId>
    <artifactId>my-library</artifactId>
    <version>1.0</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/my-library.jar</systemPath>
</dependency>

Ardından, sistem bağımlılığınız için sınıf yolunu manuel olarak ekleyin

<Class-Path>libs/my-library-1.0.jar</Class-Path>

Tam yapılandırma:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <archive>
            <manifestEntries>
                <Build-Jdk>${jdk.version}</Build-Jdk>
                <Implementation-Title>${project.name}</Implementation-Title>
                <Implementation-Version>${project.version}</Implementation-Version>
                <Specification-Title>${project.name} Library</Specification-Title>
                <Specification-Version>${project.version}</Specification-Version>
                <Class-Path>libs/my-library-1.0.jar</Class-Path>
            </manifestEntries>
            <manifest>
                <addClasspath>true</addClasspath>
                <mainClass>com.company.app.MainClass</mainClass>
                <classpathPrefix>libs/</classpathPrefix>
            </manifest>
        </archive>
    </configuration>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.5.1</version>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.build.directory}/libs/</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

9

Daha önce bunu yapmak için bir model yazmıştım .

Pascal tarafından önerilen çözüme çok benzer, ancak tüm bu bağımlılıkları özel bir havuz modülüne taşır, böylece çok modüllü bir yapı ise bağımlılığın kullanıldığı her yerde tekrarlamanız gerekmez.


6

Temel olarak, pom.xml dosyasına ekleyin:

...

<repositories>
   <repository>
       <id>lib_id</id>
       <url>file://${project.basedir}/lib</url>
   </repository>
</repositories>

...

<dependencies>
  ...
  <dependency>
      <groupId>com.mylibrary</groupId>
      <artifactId>mylibraryname</artifactId>
      <version>1.0.0</version>
  </dependency>
  ...
</dependencies>

4

gradle'a geçtik ve bu gradle'da çok daha iyi çalışıyor;). sadece böyle geçici durumlar için kavanozları bırakabileceğimiz bir klasör belirtiyoruz. Kavanozlarımızın çoğunun tipik olarak bağımlılık yönetimi bölümünde tanımlandığı (yani maven ile aynı). Bu, tanımladığımız sadece bir bağımlılık.

bu yüzden temelde şimdi bir yerde bir maven deposu değilse, geçici test için lib direk içine istediğiniz herhangi bir kavanoz bırakabilirsiniz.


1
Bunu nasıl yaptığınıza bir örnek verebilir misiniz?
Thomas

2

Pascal tarafından yayınlanan çözüme küçük bir ekleme

Bu rotayı takip ettiğimde, ojdbc kavanozunu takarken maven'de bir hata aldım.

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

-DpomFile eklendikten sonra sorun çözüldü.

$ 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

0

Çalıştırılabilir bir Jar: Export / Runable Jar dosyası oluşturmak için eclipse kullanabilirsiniz


Soruyu cevapladığından emin değilim. Dosyayı zaten kavanoz olarak almış.
Johannes Jander

Tutulma uberjar veya gölgeli kavanozu destekler, bu yüzden onun bir çözümü, ancak maven için değil
Alex Lehmann
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.