Maven: cara terbaik untuk menghubungkan JAR eksternal kustom ke proyek saya?

151

Ini beberapa hari pertama saya belajar Maven dan saya masih berjuang dengan dasar-dasarnya. Saya memiliki file .jar eksternal (tidak tersedia di repo publik) yang saya butuhkan untuk referensi dalam proyek saya dan saya mencoba mencari tahu apa pilihan terbaik saya.

Ini adalah proyek skala kecil tanpa repositori pusat untuk perpustakaan, jadi itu harus berupa repositori lokal (entah bagaimana ditambahkan ke kontrol sumber, tidak tahu apakah itu seharusnya bekerja seperti itu?) Atau .jar perlu disimpan di disk di luar repositori formal apa pun.

1) Apa opsi terbaik saya untuk menambahkan file .jar ke referensi proyek saya dengan maven mengingat bahwa saya ingin baik proyek dan perpustakaan berada di kontrol sumber?

2) Saya masih belum bisa melihat Eclipse melihat ketergantungan. Saya secara manual menambahkannya ke bagian pom, dan itu muncul dengan baik di daftar Ketergantungan dalam m2eclipse. kompilasi mvn dan paket mvn keduanya berhasil, tetapi menjalankan program menghasilkan:

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

Ini setelah mengedit POM sebagai:

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

Haruskah saya menjalankan mvn install: install-file bahkan berpikir saya sudah memiliki pom.xml diedit seperti di atas?

Terima kasih!

Alexandr Kurilin
sumber

Jawaban:

67

Saya pikir Anda harus menggunakan mvn install:install-file untuk mengisi repositori lokal Anda dengan toples perpustakaan maka Anda harus mengubah ruang lingkup dari sistem ke kompilasi.

Jika Anda mulai dengan maven, saya sarankan untuk menggunakan maven secara langsung bukan plugin IDE karena menambah lapisan kompleksitas.

Adapun kesalahan, apakah Anda menempatkan guci yang diperlukan pada classpath Anda? Jika Anda menggunakan tipe dari pustaka, Anda juga harus memiliki akses ke runtime. Ini tidak ada hubungannya dengan pakar itu sendiri.

Saya tidak mengerti mengapa Anda ingin menempatkan perpustakaan ke kontrol sumber - itu untuk kode sumber bukan guci biner.

penguntit
sumber
36
untuk lebih lanjut tentang mvn install::install-file: mkyong.com/maven/…
Doug T.
7
Menggunakan mvn install::install-filepada repositori lokal Anda akan berarti bahwa siapa pun yang mengkloning kode sumber Anda harus melakukan langkah manual ini juga. Kalau tidak, bangunannya rusak
Isen Ng
itu tidak akan menambah toples ke file perang.
Prachi
207

Anda dapat membuat Repositori Dalam Proyek, sehingga Anda tidak harus run mvn install:install-filesetiap kali mengerjakan komputer baru

<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

detail baca posting blog ini

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

Charlie Wu
sumber
2
Menggunakan solusi di atas menunjukkan peringatan saat melakukan "paket mvn clean" - POM untuk proyek <dependency_name> hilang, tidak ada informasi ketergantungan yang tersedia.
Jignesh Gohel
Itu solusi terbaik untuk kasus-kasus di mana Anda perlu menambahkan satu atau hanya beberapa file jar. Terima kasih.
Antonio Sesto
2
Atau, Anda dapat menambahkan dependensi lokal secara langsung seperti di stackoverflow.com/a/22300875/640378
mauryat
2
Saya harus menggunakan file: /// $ {project.basedir} / libs (3 garis miring) alih-alih file: // $ {project.basedir} / libs
Loc Phan
2
Jika toples diinstal, bukan toples kompilasi pakar, Anda juga perlu menambahkan file pom baru untuk mendefinisikan metadata. Untuk menyelamatkan diri Anda dari semua masalah manual ini, saya akan merekomendasikan untuk menggunakan mvn install:install-filedan kemudian menyalin seluruh struktur direktori dari repositori lokal Anda ke repositori dalam proyek Anda.
Isen Ng
33

Ini dapat dengan mudah dicapai dengan menggunakan elemen <scope> bersarang di dalam elemen <dependency>.

Sebagai contoh:

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

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

Jignesh Gohel
sumber
Metode ini bekerja dengan sangat baik ketika Anda hanya memiliki Eclipse Embedded Maven, dan Anda tidak memiliki plugin instal (sistem offline), sehingga Anda tidak dapat menjalankan installtujuan pada proyek depend-ed. Ofc memiliki sistem airgapped dan memiliki semua plugin selain plugin instal, adalah situasi yang cukup langka.
Cardin Lee JH
1
Terbersih dan termudah.
Ajay Kumar
cara menambahkan path dependensi lokal yang berada di luar folder $ {project.basedir}, seperti saya ingin $ {basedir} \ src \ lib \ ldapjdk.jar path 1 level di folder lain
Naveen Kumar
Saya mendapatkan kesalahan -"The POM for … is missing, no dependency information available” even though it exists in Maven Repository
garg10mungkin
28

Manual Maven mengatakan untuk melakukan ini:

mvn install:install-file -Dfile=non-maven-proj.jar -DgroupId=some.group -DartifactId=non-maven-proj -Dversion=1 -Dpackaging=jar
Vladislav Rastrusny
sumber
4
perintah ini instal lib ke dalam repo pakar Anda. Kelemahan dari ini adalah jika Anda mencoba untuk mengerjakan proyek di komputer yang berbeda, Anda harus menjalankan ini lagi.
Charlie Wu
25

pembaruan Kami baru saja menginstal server Nexus kami sendiri, jauh lebih mudah dan bersih.

Di perusahaan kami, kami memiliki beberapa guci yang kami beberapa guci yang umum tetapi tidak di-host di repositori pakar, kami juga tidak ingin memiliki mereka di penyimpanan lokal. Kami membuat repo mvn (publik) yang sangat sederhana di Github (tetapi Anda dapat menghostingnya di server mana pun atau secara lokal):
perhatikan bahwa ini hanya ideal untuk mengelola beberapa file jar yang jarang disiarkan

  1. Buat repo di GitHub:
    https://github.com/<user_name>/mvn-repo/

  2. Tambahkan Repositori di pom.xml
    (Catat bahwa file mentah path lengkap akan sedikit berbeda dari nama repo)

    <repository>
        <id>project-common</id>
        <name>Project Common</name>
        <url>https://github.com/<user_name>/mvn-repo/raw/master/</url>
    </repository>
  3. Tambahkan dependensi ke host (Github atau server pribadi)
    a. Yang perlu Anda ketahui adalah bahwa file disimpan dalam pola yang disebutkan oleh @glitch
    /groupId/artifactId/version/artifactId-version.jar
    b. Pada host Anda buat folder untuk mencocokkan pola ini.
    yaitu jika Anda memiliki file jar bernama service-sdk-0.0.1.jar, buat folder service-sdk/service-sdk/0.0.1/dan tempatkan file jar service-sdk-0.0.1.jarke dalamnya.
    c. Uji dengan mencoba mengunduh toples dari browser (dalam kasus kami:https://github.com/<user_name>/mvn-repo/raw/master/service-sdk/service-sdk/0.0.1/service-sdk-0.0.1.jar

  4. Tambahkan ketergantungan ke file pom.xml Anda:

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

Kenny Cason
sumber
bagus, itu solusi terukur yang saya temukan, terima kasih
Charlie Wu
11

Jangan gunakan systemPath. Bertolak belakang dengan apa yang dikatakan orang di sini, Anda dapat memasukkan toples eksternal ke dalam folder di bawah direktori proyek yang sudah Anda periksa dan surga Maven menemukannya seperti dependensi lainnya. Berikut adalah dua langkah penting:

  1. Gunakan "mvn install: install-file" dengan -DlocalRepositoryPath.
  2. Konfigurasikan repositori untuk menunjuk ke jalur itu di POM Anda.

Ini cukup mudah dan Anda dapat menemukan contoh langkah-demi-langkah di sini: http://randomizedsort.blogspot.com/2011/10/configuring-maven-to-use-local-library.html

Nehc
sumber
8

Cara Maven untuk menambahkan guci non maven ke proyek maven

Proyek Maven dan guci bukan pakar

Tambahkan plugin instalasi pakar di bagian build Anda

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

Tambahkan ketergantungan

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

Referensi Catatan Saya adalah pemilik blog

kerajinan tangan
sumber
Bagaimana Anda tahu versi guci dan plugin instalasi maven?
osk
versi guci hanya dibuat, maven menginstal versi plugin adalah terbaru
craftsmannadeem
7

Jika Anda mengalami masalah yang sama dan Anda menggunakan spring-boot v1.4 + , Anda dapat melakukannya dengan cara ini.

Ada includeSystemScope yang bisa Anda gunakan untuk menambahkan dependensi cakupan sistem ke toples.

misalnya

Saya menggunakan driver oracle ke proyek saya.

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

kemudian buat includeSystemScope = true untuk memasukkan jar ke jalur / BOOT-INF / lib / **

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

dan dikecualikan dari sumber daya untuk menghindari duplikasi termasuk, toples cukup gemuk ~

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

Semoga berhasil!

chendu
sumber
Saya mencari solusi seperti ini, hanya karena ketika pengembang baru tiba, ini menyederhanakan prosedur instalasi. Ketika Anda tidak memiliki server buatan, cara ini lebih mudah untuk memiliki ketergantungan khusus pada proyek Anda. Juga ketika Anda menggunakan CI, solusi ini menghindari untuk menginstal stoples secara manual di server CI.
Dalc
Bagaimana dengan beberapa toples ??
mithun_ghose
4

Ubah systemPath Anda .

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

Pom.xml akan melihat repositori lokal Anda untuk mencoba dan menemukan ketergantungan yang sesuai dengan artefak Anda. Juga Anda seharusnya tidak benar-benar menggunakan lingkup sistem atau atribut systemPath, ini biasanya disediakan untuk hal-hal yang ada di JDK dan bukan JRE

Lihat pertanyaan ini untuk cara menginstal artefak pakar.

Tim Sparg
sumber
3

Perhatikan bahwa semua contoh yang digunakan

<repository>...</respository> 

membutuhkan luar

<repositories>...</repositories> 

melampirkan tag. Tidak jelas dari beberapa contoh.


sumber
2

Solusi terbaik di sini adalah menginstal repositori: Nexus atau Artifactory. Jika memberi Anda tempat untuk meletakkan hal-hal seperti ini, dan lebih lanjut mempercepat dengan menyimpan barang-barang Anda dari luar.

Jika hal yang Anda hadapi adalah open source, Anda mungkin juga mempertimbangkan untuk menempatkannya di pusat.

Lihat panduannya .

bmargulies
sumber
1

Dengan Eclipse Oxygen Anda dapat melakukan hal-hal di bawah ini:

  1. Tempatkan perpustakaan Anda di WEB-INF / lib
  2. Project -> Configure Build Path -> Add Library -> Web App Library

Maven akan mengambilnya saat menginstal proyek.

Rick
sumber
3
Jika ya, apakah pengguna lain yang menarik proyek saya harus melakukan hal yang sama di Eclipse?
cruxi
0

Jika tabung eksternal dibuat oleh proyek Maven hanya maka Anda dapat menyalin seluruh proyek pada sistem Anda dan menjalankan

mvn install

dalam direktori proyek. Ini akan menambahkan jar ke direktori .m2 yang merupakan repositori pakar lokal.

Sekarang Anda dapat menambahkan

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

Ini akan memastikan bahwa Anda

mvn exec:java 

bekerja. Jika Anda menggunakan yang disarankan di sini

<scope>system</scope>

Maka Anda harus menambahkan kelas secara individual saat menggunakan mengeksekusi melalui baris perintah.

Anda bisa menambahkan guci eksternal dengan perintah berikut yang dijelaskan di sini

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

Cara paling efisien dan terbersih yang saya temukan untuk mengatasi masalah ini adalah dengan menggunakan Paket Github

  1. Buat repositori publik / pribadi kosong sederhana di GitHub sesuai kebutuhan Anda, apakah Anda ingin toples eksternal Anda dihosting secara publik atau tidak.

  2. Jalankan di bawah perintah maven untuk menyebarkan Anda jar eksternal di repositori github dibuat di atas

    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

    Perintah di atas akan menyebarkan Anda jar eksternal di repositori GitHub yang disebutkan dalam -Durl=. Anda dapat merujuk tautan ini pada Cara menggunakan dependensi sebagai Paket GitHub. Tutorial Penerapan Paket GitHub

  3. Setelah itu Anda bisa menambahkan ketergantungan menggunakan groupId, artifactIddan versiondisebutkan dalam langkah di atas di maven pom.xmldan jalankanmvn install

  4. Maven akan mengambil ketergantungan tabung eksternal dari registri Paket GitHub dan menyediakannya di proyek pakar Anda.

  5. Agar ini berfungsi, Anda juga harus mengonfigurasi maven's settings.xmluntuk diambil dari registri Paket GitHub.

Nitish Kumar
sumber