Maven: Özel harici JAR'ı projeme bağlamanın en iyi yolu?


151

Maven'i öğrendiğim ilk birkaç günüm ve hala temel konularla mücadele ediyorum. Projemde başvurmam gereken harici bir .jar dosyası var (genel depolarda mevcut değil) ve en iyi seçeneğimin ne olduğunu anlamaya çalışıyorum.

Kütüphaneler için merkezi bir depo olmayan küçük ölçekli bir proje, bu yüzden ya yerel bir havuz olmalı (bir şekilde kaynak kontrolüne eklenmiş, bu şekilde çalışması gerekip gerekmediğini bilmiyor musunuz?) Ya da .jar saklanmalıdır herhangi bir resmi havuzun dışındaki disk.

1) Hem proje hem de kütüphanenin kaynak kontrolünde olmasını istediğim için, .jar dosyasını maven ile projemin referanslarına eklemek için en iyi seçeneğim nedir?

2) Hala Tutulmanın bağımlılığı görmesini sağlayamıyorum. Pom'nın bölümüne manuel olarak ekledim ve m2eclipse'deki Bağımlılıklar listesinde iyi görünüyor. mvn compile ve mvn paketinin her ikisi de başarılı olur, ancak programı çalıştırmak şöyle sonuçlanır:

Exception in thread "main" java.lang.Error: Unresolved compilation problems:
        LibraryStuff cannot be resolved to a type

Bu POM'u şu şekilde düzenledikten sonra:

<dependency>
  <groupId>stuff</groupId>
  <artifactId>library</artifactId>
  <version>1.0</version>
  <systemPath>${lib.location}/MyLibrary.jar</systemPath>
  <scope>system</scope>
</dependency>

Ben mvn install yürütmeliyim: install-file bile pom.xml yukarıdaki gibi düzenlenmiş olduğunu düşündüm?

Teşekkürler!

Yanıtlar:


67

mvn install:install-fileYerel havuzunuzu kütüphane kavanozlarıyla doldurmak için kullanmanız gerektiğini düşünüyorum , o zaman kapsamı sistemden derlemeye değiştirmelisiniz.

Eğer maven ile başlıyorsanız, ekstra bir karmaşıklık kattığı için maven'i doğrudan IDE eklentileri kullanmamanızı öneririm.

Hataya gelince, gerekli kavanozları sınıf yolunuza koyuyor musunuz? Kitaplıktaki türleri kullanıyorsanız, çalışma zamanında da buna erişmeniz gerekir. Bunun maven ile ilgisi yoktur.

Kütüphaneyi neden kaynak kontrolüne koymak istediğinizi anlamıyorum - bu ikili kodlar için değil kaynak kodları içindir.


36
daha fazla bilgi için mvn install::install-file: mkyong.com/maven/…
Doug T.

7
mvn install::install-fileYerel deponuzda kullanmak , kaynak kodunuzu klonlayan herkesin de bu manuel adımı yapması gerektiği anlamına gelir. Aksi takdirde, yapı kutudan
çıkarılır

ama kavanozu savaş dosyasına eklemeyecek.
Prachi

207

Proje İçi Deposu oluşturabilirsiniz, böylece run mvn install:install-fileyeni bir bilgisayarda her çalıştığınızda gerekmez

<repository>
    <id>in-project</id>
    <name>In Project Repo</name>
    <url>file://${project.basedir}/libs</url>
</repository>

<dependency>
    <groupId>dropbox</groupId>
    <artifactId>dropbox-sdk</artifactId>
    <version>1.3.1</version>
</dependency>

/groupId/artifactId/version/artifactId-verion.jar

detay bu blog yazısını okuyun

https://web.archive.org/web/20121026021311/charlie.cu.cc/2012/06/how-add-external-libraries-maven


2
Yukarıdaki çözümü kullanmak "mvn clean package" yaparken bir uyarı gösterdi - <bağımlılık_adı> projesi için POM eksik, bağımlılık bilgisi yok.
Jignesh Gohel

Bu, bir veya sadece birkaç jar dosyası eklemeniz gereken durumlar için en iyi çözümdür. Teşekkürler.
Antonio Sesto

2
Veya yerel bağımlılıkları doğrudan stackoverflow.com/a/22300875/640378
mauryat

2
Dosya yerine /// $ {project.basedir} / libs (3 iletilmiş eğik çizgi) kullanmak zorunda kaldım: // $ {project.basedir} / libs
Loc Phan

2
Kavanoz kuruluysa, maven derlenmiş bir kavanoz değilse, meta verileri tanımlamak için yeni bir pom dosyası da eklemeniz gerekir. Tüm bu manuel sorunları kendiniz kurtarmak için mvn install:install-file, tüm dizin yapısını kullanmanızı ve ardından yerel deponuzdan proje içi deponuza kopyalamanızı öneririm .
Isen Ng

33

Bu, <bağımlılık> öğesinin içine yerleştirilmiş <scope> öğesi kullanılarak kolayca gerçekleştirilebilir.

Örneğin:

 <dependencies>
   <dependency>
     <groupId>ldapjdk</groupId>
     <artifactId>ldapjdk</artifactId>
     <scope>system</scope>
     <version>1.0</version>
     <systemPath>${basedir}\src\lib\ldapjdk.jar</systemPath>
   </dependency>
 </dependencies>

Referans: http://www.tutorialspoint.com/maven/maven_external_dependencies.htm


Bu yöntem yalnızca Eclipse Embedded Maven'ınız olduğunda ve yükleme eklentisinden (çevrimdışı sistem) yoksun olduğunuzda çok iyi çalışır, bu nedenle installbağımlı projede hedef çalıştıramazsınız . Ofc hava boşluklu bir sisteme sahip ve kurulum eklentisi hariç tüm eklentilere sahip oldukça nadir bir durumdur.
Cardin Lee JH

1
En temiz ve en kolay.
Ajay Kumar

$ {project.basedir} klasörünün dışındaki yerel bağımlılık yolunu nasıl ekleyebilirim, örneğin $ {basedir} \ src \ lib \ ldapjdk.jar path 1 level up other folder in
Naveen Kumar

Hata alıyorum -"The POM for … is missing, no dependency information available” even though it exists in Maven Repository
garg10may

28

Maven el kitabı şunu söylüyor :

mvn install:install-file -Dfile=non-maven-proj.jar -DgroupId=some.group -DartifactId=non-maven-proj -Dversion=1 -Dpackaging=jar

4
bu komut, lib'i maven deponuza yükleyin. Bunun dezavantajı, farklı bir bilgisayardaki bir proje üzerinde çalışmaya çalışırsanız, bunu tekrar çalıştırmanız gerekir.
Charlie Wu

25

update O zamandan beri kendi Nexus sunucumuzu kurduk, çok daha kolay ve temiz.

Şirketimizde bazı kavanozlarımız vardı, ki bunlar ortak olan ancak herhangi bir maven deposunda barındırılmayan bazı kavanozlarımız vardı, ne de onları yerel depoda bulundurmak istemedik. Github'da çok basit bir mvn (genel) repo oluşturduk (ancak herhangi bir sunucuda veya yerel olarak barındırabilirsiniz): bunun yalnızca nadiren değişen birkaç kavanoz dosyasını yönetmek için ideal olduğunu
unutmayın .

  1. GitHub'da repo oluştur:
    https://github.com/<user_name>/mvn-repo/

  2. Pom.xml
    dosyasına Repository ekleyin (Tam yol ham dosyasının repo adından biraz farklı olacağını unutmayın)

    <repository>
        <id>project-common</id>
        <name>Project Common</name>
        <url>https://github.com/<user_name>/mvn-repo/raw/master/</url>
    </repository>
  3. Ana bilgisayara bağımlılık ekleme (Github veya özel sunucu)
    a. Bilmeniz gereken tek şey, dosyaların @glitch
    /groupId/artifactId/version/artifactId-version.jar
    b. Ana makinenizde bu kalıba uyacak klasörleri oluşturun.
    yani, bir jar dosyanız varsa service-sdk-0.0.1.jar, klasörü oluşturun service-sdk/service-sdk/0.0.1/ve jar dosyasını service-sdk-0.0.1.jariçine yerleştirin.
    c. Kavanozu bir tarayıcıdan indirmeye çalışarak test edin (bizim durumumuzda:https://github.com/<user_name>/mvn-repo/raw/master/service-sdk/service-sdk/0.0.1/service-sdk-0.0.1.jar

  4. Pom.xml dosyanıza bağımlılık ekleyin:

    <dependency>
        <groupId>service-sdk</groupId>
        <artifactId>service-sdk</artifactId>
        <version>0.0.1</version>
    </dependency>
  5. Zevk almak


güzel, bulduğum en ölçeklenebilir çözüm, teşekkürler
Charlie Wu

11

SystemPath kullanmayın. İnsanların burada söylediklerinin aksine, teslim alınmış proje dizininizin altındaki bir klasöre harici bir kavanoz koyabilir ve Maven'in diğer bağımlılıklar gibi bulmasını sağlayabilirsiniz. İşte iki önemli adım:

  1. -DlocalRepositoryPath ile "mvn install: install-file" kullanın.
  2. Bir havuzu POM'nizdeki o yola işaret edecek şekilde yapılandırın.

Oldukça basittir ve burada adım adım bir örnek bulabilirsiniz: http://randomizedsort.blogspot.com/2011/10/configuring-maven-to-use-local-library.html


8

Maaven projesine maven olmayan kavanozlar eklemenin maven yolu

Maven Projesi ve mayasız kavanozlar

Maven kurulum eklentilerini derleme bölümünüze ekleyin

<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-install-plugin</artifactId>
        <version>${version.maven-install-plugin}</version>
        <executions>

            <execution>
                <id>install-external-non-maven1-jar</id>
                <phase>clean</phase>
                <configuration>
                    <repositoryLayout>default</repositoryLayout>
                    <groupId>jar1.group</groupId>
                    <artifactId>non-maven1</artifactId>
                    <version>${version.non-maven1}</version>
                    <file>${project.basedir}/libs/non-maven1.jar</file>
                    <packaging>jar</packaging>
                    <generatePom>true</generatePom>
                </configuration>
                <goals>
                    <goal>install-file</goal>
                </goals>
            </execution>
            <execution>
                <id>install-external-non-maven2-jar</id>
                <phase>clean</phase>
                <configuration>
                    <repositoryLayout>default</repositoryLayout>
                    <groupId>jar2.group</groupId>
                    <artifactId>non-maven2</artifactId>
                    <version>${version.non-maven2}</version>
                    <file>${project.basedir}/libs/non-maven2.jar</file>
                    <packaging>jar</packaging>
                    <generatePom>true</generatePom>
                </configuration>
                <goals>
                    <goal>install-file</goal>
                </goals>
            </execution>
            <execution>
                <id>install-external-non-maven3-jar</id>
                <phase>clean</phase>
                <configuration>
                    <repositoryLayout>default</repositoryLayout>
                    <groupId>jar3.group</groupId>
                    <artifactId>non-maven3</artifactId>
                    <version>${version.non-maven3}</version>
                    <file>${project.basedir}/libs/non-maven3.jar</file>
                    <packaging>jar</packaging>
                    <generatePom>true</generatePom>
                </configuration>
                <goals>
                    <goal>install-file</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

Bağımlılığı ekleyin

<dependencies>
    <dependency>
        <groupId>jar1.group</groupId>
        <artifactId>non-maven1</artifactId>
        <version>${version.non-maven1}</version>
    </dependency>
    <dependency>
        <groupId>jar2.group</groupId>
        <artifactId>non-maven2</artifactId>
        <version>${version.non-maven2}</version>
    </dependency>
    <dependency>
        <groupId>jar3.group</groupId>
        <artifactId>non-maven3</artifactId>
        <version>${version.non-maven3}</version>
    </dependency>
</dependencies>

Referanslar Not Blogun sahibiyim


Kavanozların ve maven kurulum eklentisinin sürümlerini nasıl biliyorsunuz?
osk

kavanozların versiyonları yeni oluşturuldu, maven eklentisi versiyonlarını yükleyin en son
craftsmannadeem

7

Aynı sorunu yaşıyorsanız ve spring-boot v1.4 + kullanıyorsanız , bunu bu şekilde yapabilirsiniz.

Kavanoza sistem kapsamı bağımlılıkları eklemek için kullanabileceğiniz bir includeSystemScope vardır.

Örneğin

Projemde oracle driver kullanıyorum.

<dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc14</artifactId>
        <version>10.2.0.3.0</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/src/main/resources/extra-jars/ojdbc14-10.2.0.3.0.jar</systemPath>
    </dependency>

ardından jar yoluna / BOOT-INF / lib / ** eklemek için includeSystemScope = true yapın

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <includeSystemScope>true</includeSystemScope>
    </configuration>
</plugin>

ve çoğaltılmasını önlemek için kaynaktan hariç tutun, kavanoz yağ yeterli ~

<build>
    <testSourceDirectory>src/test/java</testSourceDirectory>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <excludes>
                <exclude>**/*.jar</exclude>
            </excludes>
        </resource>
    </resources>
</build>

İyi şanslar!


Bunun gibi bir çözüm arıyordum, çünkü yeni bir geliştirici geldiğinde, bu kurulum prosedürünü basitleştiriyor. Suni bir sunucunuz olmadığında, projenizde özel bağımlılığa sahip olmanın yolu daha kolaydır. Ayrıca bir CI kullandığınızda, bu çözüm kavanozu CI sunucusuna manuel olarak yüklemekten kaçının.
Dalc

Çoklu kavanozlara ne dersiniz?
mithun_ghose

4

SystemPath'inizi değiştirin .

<dependency>
  <groupId>stuff</groupId>
  <artifactId>library</artifactId>
  <version>1.0</version>
  <systemPath>${project.basedir}/MyLibrary.jar</systemPath>
  <scope>system</scope>
</dependency>

3

Pom.xml, yapınızla eşleşen bağımlılığı denemek ve bulmak için yerel deponuza bakacaktır. Ayrıca gerçekten sistem kapsamını veya systemPath özniteliklerini kullanmamalısınız, bunlar normalde JRE için değil JDK'da olan şeyler için ayrılmıştır

Maven yapılarının nasıl kurulacağı hakkında bu soruya bakın .


3

Kullanan tüm örneklerin

<repository>...</respository> 

dış gereksinim

<repositories>...</repositories> 

etiketler. Bazı örneklerden açık değil.


2

Buradaki en iyi çözüm bir depo kurmaktır: Nexus veya Artifactory. Eğer böyle şeyler koymak için bir yer verir ve daha da dışarıdan şeyler önbellek şeyler hızlandırır.

Eğer ilgileniyor şey açık kaynak ise, ayrıca düşünebilirsiniz koyarak merkezi haline de.

Bkz kılavuzu .


1

Eclipse Oxygen ile aşağıdakileri yapabilirsiniz:

  1. Kütüphanelerinizi WEB-INF / lib'e yerleştirin
  2. Proje -> Derleme Yolunu Yapılandır -> Kütüphane Ekle -> Web Uygulama Kütüphanesi

Maven, projeyi kurarken onları alacak.


3
Eğer öyleyse, projemi çeken diğer kullanıcılar Eclipse'de de aynısını yapmak zorunda mıdır?
cruxi

0

Harici kavanoz yalnızca bir Maven projesi tarafından oluşturulmuşsa, projenin tamamını sisteminize kopyalayabilir ve bir

mvn install

proje dizininde. Bu, kavanozu yerel maven deposu olan .m2 dizinine ekler.

Şimdi ekleyebilirsiniz

<dependency>
     <groupId>copy-from-the=maven-pom-of-existing-project</groupId>
     <artifactId>copy-from-the=maven-pom-of-existing-project</artifactId>
     <version>copy-from-the=maven-pom-of-existing-project</version>
</dependency>

Bu,

mvn exec:java 

İşler. Burada önerilen kullanırsanız

<scope>system</scope>

Ardından komut satırı üzerinden yürütmeyi kullanırken sınıfları tek tek eklemeniz gerekecektir.

Harici kavanozları , burada açıklanan aşağıdaki komutla ekleyebilirsiniz.

mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> \
-DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>

0

Bu sorunla başa çıkmanın en etkili ve en temiz yolu Github Paketleri kullanmaktır.

  1. Harici kavanozunuzun herkese açık olarak barındırılmasını isteyip istemediğinize göre, gereksiniminize göre GitHub'da basit, boş bir genel / özel havuz oluşturun.

  2. Yukarıda oluşturulan github deposunda harici kavanoz dağıtmak için maven komutunun altında çalıştırın

    mvn deploy:deploy-file \ -DgroupId= your-group-id \ -DartifactId= your-artifact-id \ -Dversion= 1.0.0 -Dpackaging= jar -Dfile= path-to-file \ -DrepositoryId= id-to-map-on-server-section-of-settings.xml \ -Durl=https://maven.pkg.github.com/github-username/github-reponame-created-in-above-step

    Yukarıdaki komut sizi GitHub deposunda belirtilen harici kavanoza dağıtır -Durl=. Bağımlılıkları GitHub Paketleri olarak dağıtma konusundaki bu bağlantıya GitHub Paketi Dağıtım Öğreticisi olarak başvurabilirsiniz.

  3. Bundan sonra kullanarak bağımlılık ekleyebilir groupId, artifactIdve versionmaven içinde yukarıdaki adımda belirtilen pom.xmlve kaçakmvn install

  4. Maven, dış kavanozun bağımlılığını GitHub Packages kayıt defterinden alır ve maven projenizi sağlar.

  5. Bunun çalışması için Git'in settings.xmlUbunt Paketi kayıt defterinden getirecek şekilde yapılandırmanız gerekir .

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.