Bisakah saya menambahkan toples ke maven 2 membangun classpath tanpa menginstalnya?

700

Maven2 membuatku gila selama fase pengembangan percobaan / mock-up cepat dan kotor.

Saya memiliki pom.xmlfile yang mendefinisikan dependensi untuk kerangka kerja aplikasi web yang ingin saya gunakan, dan saya dapat dengan cepat menghasilkan proyek pemula dari file itu. Namun, kadang-kadang saya ingin menautkan ke perpustakaan pihak ke-3 yang belum memiliki pom.xmlfile yang ditentukan, jadi daripada membuat pom.xmlfile untuk lib pihak ke-3 dengan tangan dan menginstalnya, dan menambahkan ketergantungan pada saya pom.xml, saya hanya ingin memberi tahu Maven: "Selain dependensi yang ditentukan, sertakan juga toples yang ada di /libdalamnya."

Sepertinya ini seharusnya sederhana, tetapi jika ya, saya kehilangan sesuatu.

Setiap petunjuk tentang cara melakukan ini sangat dihargai. Singkatnya, jika ada cara sederhana untuk mengarahkan maven ke /libdirektori dan dengan mudah membuat pom.xmldengan semua guci terlampir yang dipetakan ke satu dependensi yang kemudian bisa saya beri nama / instal dan tautkan ke dalam satu gerakan juga cukup.

BuZZ-dEE
sumber
Jika Anda menggunakan Netbeans cukup ikuti langkah-langkah ini: [Bagaimana cara saya menginstal modul ke repositori maven menggunakan Netbeans embedded Maven?] [1] [1]: stackoverflow.com/a/339874/530153
Rajat Gupta
1
Saya ingin menunjukkan bahwa tautan ini stackoverflow.com/a/339874/530153 tampaknya berfungsi untuk memasang toples satu per satu.
Paul

Jawaban:

600

Masalah pendekatan populer

Sebagian besar jawaban yang akan Anda temukan di internet akan menyarankan Anda untuk menginstal dependensi ke repositori lokal Anda atau menentukan cakupan "sistem" di pomdan mendistribusikan dependensi dengan sumber proyek Anda. Tetapi kedua solusi ini sebenarnya cacat.

Mengapa Anda tidak harus menerapkan pendekatan "Instal ke Repo Lokal"

Ketika Anda menginstal dependensi ke repositori lokal Anda, itu tetap ada. Artefak distribusi Anda akan baik-baik saja asalkan memiliki akses ke repositori ini. Masalahnya adalah dalam kebanyakan kasus repositori ini akan berada di komputer lokal Anda, jadi tidak akan ada cara untuk menyelesaikan ketergantungan ini pada mesin lain. Jelas membuat artefak Anda bergantung pada mesin tertentu bukanlah cara untuk menangani berbagai hal. Kalau tidak, ketergantungan ini harus dipasang secara lokal pada setiap mesin yang bekerja dengan proyek itu yang tidak lebih baik.

Mengapa Anda tidak harus menerapkan pendekatan "Cakupan Sistem"

Guci yang Anda andalkan dengan pendekatan "Lingkup Sistem" tidak bisa diinstal ke repositori apa pun atau dilampirkan ke paket target Anda. Itu sebabnya paket distribusi Anda tidak akan memiliki cara untuk mengatasi ketergantungan itu ketika digunakan. Yang saya percaya adalah alasan mengapa penggunaan ruang lingkup sistem bahkan menjadi usang. Pokoknya Anda tidak ingin bergantung pada fitur usang.

Solusi repositori statis dalam proyek

Setelah meletakkan ini di pom:

<repository>
    <id>repo</id>
    <releases>
        <enabled>true</enabled>
        <checksumPolicy>ignore</checksumPolicy>
    </releases>
    <snapshots>
        <enabled>false</enabled>
    </snapshots>
    <url>file://${project.basedir}/repo</url>
</repository>

untuk setiap artefak dengan id grup bentuk x.y.zMaven akan menyertakan lokasi berikut di dalam dir proyek Anda dalam pencariannya untuk artefak:

repo/
| - x/
|   | - y/
|   |   | - z/
|   |   |   | - ${artifactId}/
|   |   |   |   | - ${version}/
|   |   |   |   |   | - ${artifactId}-${version}.jar

Untuk menjelaskan lebih lanjut tentang ini, Anda dapat membaca posting blog ini .

Gunakan Maven untuk menginstal ke proyek repo

Alih-alih membuat struktur ini dengan tangan, saya sarankan untuk menggunakan plugin Maven untuk menginstal guci Anda sebagai artefak. Jadi, untuk menginstal artifact ke repositori dalam-proyek di dalam repofolder, jalankan:

mvn install:install-file -DlocalRepositoryPath=repo -DcreateChecksum=true -Dpackaging=jar -Dfile=[your-jar] -DgroupId=[...] -DartifactId=[...] -Dversion=[...]

Jika Anda memilih pendekatan ini, Anda dapat menyederhanakan deklarasi repositori pommenjadi:

<repository>
    <id>repo</id>
    <url>file://${project.basedir}/repo</url>
</repository>

Naskah pembantu

Karena mengeksekusi perintah instalasi untuk setiap lib agak menjengkelkan dan pasti rentan kesalahan, saya telah membuat skrip utilitas yang secara otomatis menginstal semua guci dari libfolder ke repositori proyek, sementara secara otomatis menyelesaikan semua metadata (groupId, artifactId, dll.) Dari nama file. Script juga mencetak dependensi xml untuk Anda salin-tempel di pom.

Sertakan dependensi dalam paket target Anda

Ketika repositori dalam-proyek Anda dibuat, Anda akan memecahkan masalah mendistribusikan dependensi proyek dengan sumbernya, tetapi sejak itu artefak target proyek Anda akan tergantung pada guci yang tidak dipublikasikan, jadi ketika Anda menginstal ke repositori ia akan memiliki dependensi yang tidak dapat dipecahkan.

Untuk mengatasi masalah ini, saya sarankan untuk memasukkan dependensi ini dalam paket target Anda. Ini dapat Anda lakukan dengan Plugin Majelis atau lebih baik dengan Plugin OneJar . Dokumentasi resmi tentang OneJar mudah dipahami.

Nikita Volkov
sumber
3
Saya selalu berasumsi Anda bisa membuat repositori dalam proyek, akhirnya mengonfirmasi, hebat!
albfan
19
Dua hal yang perlu diperhatikan: 1) Saya sarankan menggunakan "$ {project.baseUri} repo" daripada "file: // $ {project.basedir} / repo" untuk mendapatkan url yang sesuai dengan RFC juga di Windows. 2) Jika Anda menyusun proyek Anda menjadi submodul, pendekatan ini tampaknya gagal karena $ {project.baseUri} akan diselesaikan ke subdirektori modul. Adakah cara untuk mengatasi masalah ini?
Oliver Hanappi
8
Ini hampir membuat saya di sana - tetapi skrip Nikita mencoba menjadi terlalu pintar dengan file JAR dengan nama buruk yang saya miliki. Jadi saya membuat versi yang disederhanakan yang tidak menebak-nebak untuk groupId: github.com/carchrae/install-to-project-repo
Tom Carchrae
3
jawaban yang sangat brilian !! Ada 2 cara untuk melakukan sesuatu, dengan cara yang benar dan cara yang berhasil, Anda melakukannya dengan cara yang benar!
Panthro
1
di sini Anda juga menemukan info cara membuat artefak secara otomatis dari file jar Anda: devcenter.heroku.com/articles/local-maven-dependencies
Dirk
485

Hanya untuk membuang kode

mengatur ruang lingkup == sistem dan hanya membuat groupId, artifactId, dan versi

<dependency>
    <groupId>org.swinglabs</groupId>
    <artifactId>swingx</artifactId>
    <version>0.9.2</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/swingx-0.9.3.jar</systemPath>
</dependency>

Catatan: dependensi sistem tidak disalin ke dalam jar / perang yang dihasilkan
(lihat Cara memasukkan dependensi sistem dalam perang yang dibuat menggunakan pakar )

Pirolistik
sumber
4
Terima kasih ini sangat dekat dengan apa yang saya inginkan. Adakah cara untuk menambahkan semuanya sebagai satu entri? Katakanlah saya memiliki / lib dengan 10 stoples, dapatkah saya menambahkan semuanya entah bagaimana, misalnya dengan /some/path/*.jar untuk systemPath? atau saya masih harus memperlakukan masing-masing sebagai ketergantungan yang diketahui? Tetap saja, sangat dekat dengan yang saya butuhkan, terima kasih!
11
gunakan systemPath seperti ini: "<systemPath> $ {basedir} /lib/BrowserLauncher2-1_3.jar </systemPath>" $ {basedir} menunjuk ke root proyek Anda.
Frederic Morin
4
Lebih baik menggunakan proyek. awalan di jalur Anda seperti: <systemPath> $ {project.basedir} /lib/AwesomeLib.jar </systemPath>
Matthew McCullough
76
Sementara saya mengerti bahwa inilah yang diminta OP, saya masih ingin menggarisbawahi bahwa menggunakan systemlingkup adalah praktik mengerikan yang sangat tidak dianjurkan . Lihat Ketergantungan + Cakupan .
Pascal Thivent
6
@marioosh ingat maksud asli pertanyaan itu adalah untuk eksperimen cepat. Jika Anda ingin melakukan paket mvn, pasang toples ke dalam repo.
Pirolistik
63

Anda dapat membuat repositori lokal di proyek Anda

Misalnya jika Anda memiliki libsfolder dalam struktur proyek

  • Dalam libsfolder Anda harus membuat struktur direktori seperti:/groupId/artifactId/version/artifactId-version.jar

  • Di pom.xml Anda, Anda harus mendaftarkan repositori

    <repository>
        <id>ProjectRepo</id>
        <name>ProjectRepo</name>
        <url>file://${project.basedir}/libs</url>
    </repository>
    
  • dan tambahkan ketergantungan seperti biasa

    <dependency>
        <groupId>groupId</groupId>
        <artifactId>artifactId</artifactId>
        <version>version</version>
    </dependency>
    

Itu semuanya.

Untuk informasi terperinci: Cara menambahkan perpustakaan eksternal di Maven

Dmytro Boichenko
sumber
1
Jawaban Anda hampir benar. GroupId harus dibagi dalam subdirektori serveral.
Peter Fortuin
5
Tentu saja jika Anda memiliki groupId yang kompleks seperti 'com.foo.bar', struktur direktori Anda harus /com/foo/bar/artifactId/version/artifactId-verion.jar
Dmytro Boichenko
Apakah ini berbeda secara signifikan dari jawaban setahun sebelumnya ?
Joshua Taylor
Di direktori terakhir, di mana file jar berada, Anda juga perlu menambahkan file pom xml terkait.
Federico
30

Catatan: Saat menggunakan lingkup Sistem ( seperti yang disebutkan di halaman ini ), Maven membutuhkan jalur absolut.

Jika toples Anda berada di bawah root proyek Anda, Anda akan ingin mengawali nilai systemPath Anda dengan $ {basedir}.

Ed Brannin
sumber
15

Ini adalah apa yang telah saya lakukan, ia juga bekerja di sekitar masalah paket dan berfungsi dengan memeriksa kode.

Saya membuat folder baru di proyek dalam kasus saya yang saya gunakan repo, tetapi merasa bebas untuk digunakansrc/repo

Dalam POM saya, saya memiliki ketergantungan yang tidak ada di repositori umum

<dependency>
    <groupId>com.dovetail</groupId>
    <artifactId>zoslog4j</artifactId>
    <version>1.0.1</version>
    <scope>runtime</scope>
</dependency>

Saya kemudian membuat direktori berikut repo/com/dovetail/zoslog4j/1.0.1dan menyalin file JAR ke folder itu.

Saya membuat file POM berikut untuk mewakili file yang diunduh (langkah ini opsional, tetapi menghapus PERINGATAN) dan membantu orang berikutnya mencari tahu di mana saya mendapatkan file untuk memulai.

<?xml version="1.0" encoding="UTF-8" ?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.dovetail</groupId>
    <artifactId>zoslog4j</artifactId>
    <packaging>jar</packaging>
    <version>1.0.1</version>
    <name>z/OS Log4J Appenders</name>
    <url>http://dovetail.com/downloads/misc/index.html</url>
    <description>Apache Log4j Appender for z/OS Logstreams, files, etc.</description>
</project>

Dua file opsional yang saya buat adalah checksum SHA1 untuk POM dan JAR untuk menghapus peringatan checksum yang hilang.

shasum -b < repo/com/dovetail/zoslog4j/1.0.1/zoslog4j-1.0.1.jar \
          > repo/com/dovetail/zoslog4j/1.0.1/zoslog4j-1.0.1.jar.sha1

shasum -b < repo/com/dovetail/zoslog4j/1.0.1/zoslog4j-1.0.1.pom \
          > repo/com/dovetail/zoslog4j/1.0.1/zoslog4j-1.0.1.pom.sha1

Akhirnya saya menambahkan fragmen berikut ke pom.xml saya yang memungkinkan saya untuk merujuk ke repositori lokal

<repositories>
    <repository>
        <id>project</id>
        <url>file:///${basedir}/repo</url>
    </repository>
</repositories>
Archimedes Trajano
sumber
Hai, apakah Anda meletakkan file pom di repositori lokal atau di sebelah file jar Anda?
Peymankh
Dalam solusi di atas itu di sebelah file JAR. Pikiran Anda, saya tidak suka solusi di atas karena terlalu banyak pekerjaan.
Archimedes Trajano
Saya masih lebih suka solusi yang saya posting di sini stackoverflow.com/questions/2229757/…
Archimedes Trajano
Saya suka pendekatan ini, walaupun saya menggunakan plugin install maven untuk secara otomatis menginstal toples ke repo lokal.
Carl G
13

Anda benar-benar harus mendapatkan kerangka kerja melalui repositori dan mengidentifikasi dependensi Anda di muka. Menggunakan ruang lingkup sistem adalah kesalahan umum yang digunakan orang, karena mereka "tidak peduli dengan manajemen ketergantungan." Masalahnya adalah bahwa dengan melakukan ini, Anda akan berakhir dengan sosok pakar sesat yang tidak akan memperlihatkan pakar dalam kondisi normal. Anda akan lebih baik mengikuti pendekatan seperti ini .

Brian Fox
sumber
12

Inilah cara kami menambahkan atau memasang toples lokal

    <dependency>
        <groupId>org.example</groupId>
        <artifactId>iamajar</artifactId>
        <version>1.0</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/lib/iamajar.jar</systemPath>
    </dependency>

saya memberikan beberapa groupId dan artifactId default karena mereka wajib :)

Praneel PIDIKITI
sumber
11

Plugin install Maven memiliki penggunaan baris perintah untuk menginstal toples ke repositori lokal, POM adalah opsional tetapi Anda harus menentukan GroupId, ArtifactId, Versi dan Kemasan (semua hal-hal POM).

kodok
sumber
sebenarnya, apa yang dia katakan adalah bahwa Anda tidak perlu membuat pom untuk perpustakaan yang Anda impor ke dalam repositori lokal Anda
Frederic Morin
5
-1, terkadang Anda hanya ingin menambahkan file jar tanpa kesulitan menginstalnya.
Leonel
8

Menggunakan <scope>system</scope>adalah ide yang buruk karena alasan yang dijelaskan oleh orang lain, menginstal file secara manual ke repositori lokal Anda membuat build tidak dapat diproduksi kembali, dan menggunakan <url>file://${project.basedir}/repo</url>bukanlah ide yang baik karena (1) itu mungkin bukan fileURL yang terbentuk dengan baik (misalnya jika proyek diperiksa dalam direktori dengan karakter yang tidak biasa), (2) hasilnya tidak dapat digunakan jika POM proyek ini digunakan sebagai ketergantungan proyek orang lain.

Dengan asumsi Anda tidak mau mengunggah artefak ke repositori publik, saran Simeon tentang modul pembantu mengerjakan tugasnya. Tetapi ada cara yang lebih mudah sekarang ...

Rekomendasi

Gunakan non-maven-jar-maven-plugin . Melakukan persis apa yang Anda minta, tanpa ada kelemahan dari pendekatan lain.

Jesse Glick
sumber
Juga melihat maven-external-dependency-plugin meskipun non-maven-jar-maven-plugin tampaknya lebih mudah digunakan.
Jesse Glick
8

Saya menemukan cara lain untuk melakukan ini, lihat di sini dari pos Heroku

Untuk meringkas (maaf tentang beberapa copy & paste)

  • Buat repodirektori di bawah folder root Anda:
proyek Anda
+ - pom.xml
+ - src
+ - repo
  • Jalankan ini untuk menginstal tabung ke direktori repo lokal Anda
mvn deploy: deploy-file -Durl = file: /// path / ke / proyek anda / repo / -Dfile = mylib-1.0.jar -DgroupId = com.example -DartifactId = mylib -Paket = jar -Dversion = 1.0
  • Tambahkan ini milik Anda pom.xml:
<repositories>
    <!--other repositories if any-->
    <repository>
        <id>project.local</id>
        <name>project</name>
        <url>file:${project.basedir}/repo</url>
    </repository>
</repositories>


<dependency>
    <groupId>com.example</groupId>
    <artifactId>mylib</artifactId>
    <version>1.0</version>  
</dependency>
xbeta
sumber
6

Setelah berdiskusi sangat lama dengan para CloudBees tentang kemasan JAR yang benar, mereka membuat proposal yang bagus untuk solusi:

Pembuatan proyek Maven palsu yang melampirkan JAR yang sudah ada sebelumnya sebagai artefak utama, berjalan ke POM milik install: eksekusi-install file. Berikut ini adalah contoh Kinf dari POM tersebut:

 <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
            <version>2.3.1</version>
            <executions>
                <execution>
                    <id>image-util-id</id>
                    <phase>install</phase>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                    <configuration>
                        <file>${basedir}/file-you-want-to-include.jar</file>
                        <groupId>${project.groupId}</groupId>
                        <artifactId>${project.artifactId}</artifactId>
                        <version>${project.version}</version>
                        <packaging>jar</packaging>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Tetapi untuk mengimplementasikannya, struktur proyek yang ada harus diubah. Pertama, Anda harus ingat bahwa untuk setiap jenis JAR seperti itu harus dibuat proyek Maven palsu yang berbeda (modul). Dan harus ada dibuat proyek induk Maven termasuk semua sub-modul yaitu: semua pembungkus JAR dan proyek utama yang ada. Strukturnya bisa:

proyek root (ini berisi file POM induk mencakup semua sub-modul dengan modul elemen XML) (kemasan POM)

JAR 1 bungkus proyek anak Maven (kemasan POM)

JAR 2 bungkus proyek anak Maven (kemasan POM)

proyek anak Maven utama yang sudah ada (WAR, JAR, EAR .... packaging)

Saat induk berjalan melalui mvn: install atau mvn: pengemasan dipaksa dan sub-modul akan dieksekusi. Itu bisa dikhawatirkan sebagai minus di sini, karena struktur proyek harus diubah, tetapi menawarkan solusi non statis pada akhirnya

Simeon Angelov
sumber
Hanya pengamatan, tapi saya rasa Anda tidak perlu membuat POM baru untuk setiap JAR yang ingin Anda tambahkan. Seharusnya cukup untuk membuat satu POM untuk menambahkan semua JAR asalkan Anda memiliki blok eksekusi untuk setiap toples yang ingin Anda tambahkan. Anda hanya perlu memastikan bahwa setiap blok memiliki id unik. Hasilnya adalah modul Maven tunggal yang akan menambahkan semua JAR ke dalam repo lokal. (Pastikan saja bahwa koordinat pakar tidak berbenturan dengan apa pun yang mungkin sudah ada di sana atau mungkin ditambahkan nanti!)
Stormcloud
Pahlawan. Inilah yang saya inginkan. Teman yang baik. 2013 pastilah tahun yang baik;)
ndtreviv
5

Yang tampaknya paling sederhana bagi saya adalah mengkonfigurasi maven-compiler-plugin Anda untuk memasukkan toples khusus Anda. Contoh ini akan memuat file jar apa pun di direktori lib.

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <includes>
                    <include>lib/*.jar</include>
                </includes>
            </configuration>
        </plugin>
realgt
sumber
1
Jika saya menambahkan pakar ini says nothing to complile!
Ravi Parekh
Dikatakan all classes are up to date nothing to compilekarena tidak akan mencari *.javalagi. Anda dapat menambahkannya kembali menggunakan <include>**/*.java</include>. Namun tidak ada kesuksesan bagi saya untuk toples
Michael Laffargue
@Imiguelmh, ada alasan mengapa ini tidak bekerja untuk stoples?
kisna
3

Solusi aneh yang saya temukan:

menggunakan Eclipse

  • buat proyek java sederhana (non-pakar)
  • tambahkan kelas Utama
  • tambahkan semua toples ke classpath
  • ekspor Runnable JAR (ini penting, karena tidak ada cara lain di sini untuk melakukannya)
  • pilih Ekstrak perpustakaan yang diperlukan ke dalam JAR yang dihasilkan
  • memutuskan masalah lisensi
  • tadammm ... pasang toples yang dihasilkan ke m2repo Anda
  • tambahkan ketergantungan tunggal ini ke proyek Anda yang lain.

bersorak, Balint

Balint Pato
sumber
3

Jika Anda menginginkan solusi cepat dan kotor, Anda dapat melakukan hal berikut (meskipun saya tidak merekomendasikan ini untuk apa pun kecuali proyek uji, pakar akan mengeluh panjang lebar bahwa ini tidak tepat).

Tambahkan entri ketergantungan untuk setiap file jar yang Anda butuhkan, lebih disukai dengan skrip perl atau sesuatu yang serupa dan salin / tempelkan itu ke file pom Anda.

#! /usr/bin/perl

foreach my $n (@ARGV) {

    $n=~s@.*/@@;

    print "<dependency>
    <groupId>local.dummy</groupId>
    <artifactId>$n</artifactId>
    <version>0.0.1</version>
    <scope>system</scope>
    <systemPath>\${project.basedir}/lib/$n</systemPath>
</dependency>
";
Alex Lehmann
sumber
Ya inilah yang saya cari. Cara untuk mendorongnya melalui kode uji penelitian. Tidak ada yang mewah. Ya saya tahu bahwa itulah yang mereka semua katakan :) Berbagai solusi plugin maven tampaknya berlebihan untuk tujuan saya. Saya memiliki beberapa botol yang diberikan kepada saya sebagai lib pihak ke-3 dengan file pom. Saya ingin mengkompilasi / menjalankan dengan cepat. Solusi ini yang saya sesuaikan dengan python sangat berhasil bagi saya. Potong dan tempelkan ke pom saya.
Paul
3

Sebuah cepat & kotor solusi bets (berdasarkan jawaban Alex):

libs.bat

@ECHO OFF
FOR %%I IN (*.jar) DO (
echo ^<dependency^>
echo ^<groupId^>local.dummy^</groupId^>
echo ^<artifactId^>%%I^</artifactId^>
echo ^<version^>0.0.1^</version^>
echo ^<scope^>system^</scope^>
echo ^<systemPath^>${project.basedir}/lib/%%I^</systemPath^>
echo ^</dependency^>
)

Jalankan seperti ini: libs.bat > libs.txt. Kemudian buka libs.txtdan salin isinya sebagai dependensi.

Dalam kasus saya, saya hanya perlu perpustakaan untuk mengkompilasi kode saya, dan solusi ini adalah yang terbaik untuk tujuan itu.

lmiguelmh
sumber
2

Meskipun tidak persis sesuai dengan masalah Anda, saya akan menjatuhkan ini di sini. Persyaratan saya adalah:

  1. Stoples yang tidak dapat ditemukan di repositori maven online harus di SVN.
  2. Jika satu pengembang menambahkan perpustakaan lain, pengembang lain tidak perlu repot menginstalnya secara manual.
  3. IDE (NetBeans dalam kasus saya) harus dapat menemukan sumber dan javadocs untuk menyediakan pelengkapan otomatis dan bantuan.

Mari kita bicara tentang (3) pertama: Hanya memiliki guci dalam folder dan entah bagaimana menggabungkannya ke dalam guci terakhir tidak akan bekerja di sini, karena IDE tidak akan mengerti ini. Ini berarti semua perpustakaan harus diinstal dengan benar. Namun, saya tidak ingin semua orang menginstalnya menggunakan "mvn install-file".

Dalam proyek saya, saya membutuhkan metawidget. Kita mulai:

  1. Buat proyek pakar baru (beri nama "shared-libs" atau sesuatu seperti itu).
  2. Unduh metawidget dan ekstrak zip ke src / main / lib.
  3. Folder doc / api berisi javadocs. Buat zip konten (doc / api / api.zip).
  4. Ubah pom seperti ini
  5. Bangun proyek dan perpustakaan akan diinstal.
  6. Tambahkan perpustakaan sebagai dependensi ke proyek Anda, atau (jika Anda menambahkan dependensi dalam proyek shared-libs) tambahkan shared-libs sebagai dependensi untuk mendapatkan semua perpustakaan sekaligus.

Setiap kali Anda memiliki perpustakaan baru, cukup tambahkan eksekusi baru dan beri tahu semua orang untuk membangun proyek lagi (Anda dapat meningkatkan proses ini dengan hierarki proyek).

Cephalopod
sumber
Anda mungkin ingin memeriksa Maven: tambahkan dependensi ke jar dengan jalur relatif (yang merupakan IMHO alternatif yang lebih baik).
Pascal Thivent
Lebih baik jika Anda dapat memastikan bahwa repositori lokal selalu memiliki jalur relatif yang sama ke proyek. Jika saya memiliki banyak proyek (atau cabang berbeda) di lokasi yang berbeda ini tidak akan berfungsi.
Cephalopod
Jawaban saya memiliki cara untuk memberi tahu pom.xml tentang toples di dalam proyek Anda. Mengapa tidak lakukan saja, dan arahkan ke stoples di $ {basedir} / lib?
Ed Brannin
1
@ Ed Karena itu sama sekali bukan untuk apa ruang lingkup sistem, dependensi cakupan sistem memiliki banyak efek samping. Ini adalah praktik mengerikan yang harus dilarang sama sekali.
Pascal Thivent
2

Untuk menginstal toples pihak ke-3 yang tidak ada dalam repositori maven, gunakan maven-install-plugin.

Berikut langkah-langkahnya:

  1. Unduh file jar secara manual dari sumber (situs web)
  2. Buat folder dan tempatkan file jar Anda di dalamnya
  3. Jalankan perintah di bawah ini untuk menginstal jar pihak ke-3 di repositori pakar lokal Anda

mvn install: install-file -Dfile = -DgroupId = -DartifactId = -Dversion = -Dpackaging =

Di bawah ini adalah contoh yang saya gunakan untuk sim4ite log4j

mvn install: install-file -Dfile = / Users / athanka / git / MyProject / repo / log4j-rolling-appender.jar -DgroupId = uk.org.simonsite -DartifactId = log4j-rolling-appender -Dversion = 20150607-2059 - Dpackaging = toples

  1. Di pom.xml sertakan dependensi seperti di bawah ini

      <dependency> 
            <groupId>uk.org.simonsite</groupId>
            <artifactId>log4j-rolling-appender</artifactId>
            <version>20150607-2059</version> 
      </dependency>
  2. Jalankan perintah install mvn clean untuk membuat kemasan Anda

Di bawah ini adalah tautan referensi:

https://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html

Andrew TR
sumber
Ini adalah jawaban untuk tautan saja . Anda harus memperluas jawaban Anda untuk memasukkan sebanyak mungkin informasi di sini, dan menggunakan tautan hanya untuk referensi.
Selamat tinggal StackExchange
2

Bagi mereka yang tidak menemukan jawaban yang baik di sini, inilah yang kami lakukan untuk mendapatkan stoples dengan semua dependensi yang diperlukan di dalamnya. Jawaban ini ( https://stackoverflow.com/a/7623805/1084306 ) menyebutkan untuk menggunakan plugin Maven Assembly tetapi tidak benar-benar memberikan contoh dalam jawabannya. Dan jika Anda tidak membaca sampai akhir jawaban (itu cukup panjang), Anda mungkin melewatkannya. Menambahkan di bawah ini ke pom.xml Anda akan menghasilkantarget/${PROJECT_NAME}-${VERSION}-jar-with-dependencies.jar

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.4.1</version>
            <configuration>
                <!-- get all project dependencies -->
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <!-- MainClass in mainfest make a executable jar -->
                <archive>
                  <manifest>
                    <mainClass>my.package.mainclass</mainClass>
                  </manifest>
                </archive>

            </configuration>
            <executions>
              <execution>
                <id>make-assembly</id>
                <!-- bind to the packaging phase -->
                <phase>package</phase> 
                <goals>
                    <goal>single</goal>
                </goals>
              </execution>
            </executions>
        </plugin>
Donovan
sumber
1

Saya menyinggung beberapa kode python dalam komentar untuk jawaban dari @alex lehmann, jadi saya posting di sini.

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
Paul
sumber
0

Ini tidak menjawab bagaimana menambahkannya ke POM Anda, dan mungkin tidak punya otak, tetapi apakah hanya menambahkan lib dir ke pekerjaan classpath Anda? Saya tahu itulah yang saya lakukan ketika saya membutuhkan stoples eksternal yang tidak ingin saya tambahkan ke repo Maven saya.

Semoga ini membantu.

javamonkey79
sumber
1
Inilah yang saya lakukan, dan itu berhasil, tetapi juga mencemari jalur kelas global, dan saya berusaha untuk menghindarinya. Terima kasih!
@purple Persisnya bagaimana Anda melakukannya?
TheRealChx101
0

Apa yang berhasil dalam proyek kami adalah apa yang ditulis Archimedes Trajano, tapi kami punya di .m2 / settings.xml kami sesuatu seperti ini:

 <mirror>
  <id>nexus</id>
  <mirrorOf>*</mirrorOf>
  <url>http://url_to_our_repository</url>
 </mirror>

dan * harus diubah ke pusat. Jadi, jika jawabannya tidak bekerja untuk Anda, Anda harus memeriksa pengaturan Anda.xml

Łukasz Klich
sumber
0

Saya hanya ingin solusi cepat dan kotor ... Saya tidak bisa menjalankan skrip dari Nikita Volkov: kesalahan sintaks + itu memerlukan format yang ketat untuk nama-nama toples.

Saya membuat skrip Perl ini yang berfungsi dengan format apa pun untuk nama file jar, dan menghasilkan dependensi dalam xml sehingga dapat disalin secara langsung di pom.

Jika Anda ingin menggunakannya, pastikan Anda memahami apa yang dilakukan skrip, Anda mungkin perlu mengubah libfolder dan nilai untuk groupIdatau artifactId...

#!/usr/bin/perl

use strict;
use warnings;

open(my $fh, '>', 'dependencies.xml') or die "Could not open file 'dependencies.xml' $!";
foreach my $file (glob("lib/*.jar")) {
    print "$file\n";
    my $groupId = "my.mess";
    my $artifactId = "";
    my $version = "0.1-SNAPSHOT";
    if ($file =~ /\/([^\/]*?)(-([0-9v\._]*))?\.jar$/) {
        $artifactId = $1;
        if (defined($3)) {
            $version = $3;
        }
        `mvn install:install-file -Dfile=$file -DgroupId=$groupId -DartifactId=$artifactId -Dversion=$version -Dpackaging=jar`;
        print $fh "<dependency>\n\t<groupId>$groupId</groupId>\n\t<artifactId>$artifactId</artifactId>\n\t<version>$version</version>\n</dependency>\n";
        print " => $groupId:$artifactId:$version\n";
    } else {
        print "##### BEUH...\n";
    }
}
close $fh;
boumbh
sumber
0

Solusi untuk pendekatan scope = 'system' di Java:

public static void main(String[] args) {
        String filepath = "/Users/Downloads/lib/";
        try (Stream<Path> walk = Files.walk(Paths.get(filepath))) {

        List<String> result = walk.filter(Files::isRegularFile)
                .map(x -> x.toString()).collect(Collectors.toList());

                String indentation = "    ";
                for (String s : result) {
                    System.out.println(indentation + indentation + "<dependency>");
                    System.out.println(indentation + indentation + indentation + "<groupId>"
                            + s.replace(filepath, "").replace(".jar", "")
                            + "</groupId>");
                    System.out.println(indentation + indentation + indentation + "<artifactId>"
                            + s.replace(filepath, "").replace(".jar", "")
                            + "</artifactId>");
                    System.out.println(indentation + indentation + indentation + "<version>"
                            + s.replace(filepath, "").replace(".jar", "")
                            + "</version>");
                    System.out.println(indentation + indentation + indentation + "<scope>system</scope>");
                    System.out.println(indentation + indentation + indentation + "<systemPath>" + s + "</systemPath>");
                    System.out.println(indentation + indentation + "</dependency>");
                }

    } catch (IOException e) {
        e.printStackTrace();
    }
}
Oleksii Kyslytsyn
sumber