Maven: Bagaimana cara memasukkan toples, yang tidak tersedia dalam perwakilan ke dalam proyek J2EE?

100

dalam proyek J2EE saya, saya memiliki beberapa dependensi, yang tidak tersedia di repositori Maven mana pun, karena mereka adalah perpustakaan berpemilik. Pustaka ini harus tersedia saat runtime, sehingga harus disalin ke target /.../ WEB-INF / lib ...

Saat ini, saya mencantumkannya sebagai ketergantungan sistem di POM saya, tetapi dengan metode ini masalahnya adalah, itu tidak disalin ke build target selama kompilasi. Juga metode ini tidak terlalu elegan.

Jadi, manakah cara terbaik untuk mengintegrasikannya di Maven?

Catatan: Saya tidak ingin membuat repositori Maven saya sendiri.

samson
sumber
7
Saya benar-benar berpikir Anda harus meninjau keputusan Anda untuk membuat repositori Maven. Tidak sulit sama sekali dan 100% sepadan.
Robert Munteanu
7
Nilai pembuatan repositori Maven bergantung pada keadaan.
yincrash

Jawaban:

54

Seperti yang Anda katakan Anda tidak ingin mengatur repositori Anda sendiri, mungkin ini akan membantu.

Anda dapat menggunakan tujuan file instal dari maven-install-plugin untuk menginstal file ke repositori lokal. Jika Anda membuat skrip dengan permintaan Maven untuk setiap file dan menyimpannya di samping jars, Anda (dan siapa pun yang memiliki akses) dapat dengan mudah menginstal jars (dan file pom terkait) ke repositori lokalnya.

Sebagai contoh:

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

atau hanya

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

Anda kemudian dapat mereferensikan dependensi seperti biasa dalam proyek Anda.

Namun taruhan terbaik Anda masih menyiapkan repositori jarak jauh internal dan saya akan merekomendasikan menggunakan Nexus sendiri. Ini dapat berjalan di kotak pengembangan Anda jika diperlukan, dan biaya overhead minimal.

Penjual Kaya
sumber
1
Terima kasih, metode ini berfungsi dengan baik untuk saya sekarang. Saya memperpanjang POM sehingga file secara otomatis diinstal ke perwakilan lokal: pastebin.ca/1504318
samson
Senang bisa membantu, tetapi seperti yang dikatakan orang lain, pendekatan terbaik adalah menggunakan manajer repositori Maven. Pendekatan ini tidak berkembang dengan baik.
Rich Seller
4
Perintah yang berfungsi untuk saya: "mvn install: install-file -Dfile = cassandra-jdbc-1.1.1.jar -DgroupId = org.apache-extras.cassandra-jdbc -DartifactId = cassandra-jdbc -Dversion = 1.1.1 -Dpackaging = jar "
Mazrick
193

Untuk orang yang menginginkan solusi cepat untuk masalah ini:

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

cukup beri perpustakaan Anda groupID unik dan nama artefak dan arahkan ke tempatnya di sistem file. Anda baik untuk pergi.

Tentu saja ini adalah perbaikan cepat kotor yang HANYA akan bekerja pada mesin Anda dan jika Anda tidak mengubah jalur ke libs. Tetapi terkadang, hanya itu yang Anda inginkan, untuk menjalankan dan melakukan beberapa tes.

EDIT: cukup ulangi pertanyaan dan sadari bahwa pengguna sudah menggunakan solusi saya sebagai perbaikan sementara. Saya akan meninggalkan jawaban saya sebagai bantuan cepat untuk orang lain yang datang ke pertanyaan ini. Jika ada yang tidak setuju dengan ini, tolong beri saya komentar. :)

Ric Jafe
sumber
4
Keren. Apakah ada cara untuk menentukan URL alih-alih jalur mesin lokal?
phreakhead
3
Terima kasih atas contoh yang lengkap dan berfungsi !!! Saya harap Anda menangkap ikan mas dan itu mengabulkan tiga permintaan Anda. :)
johndodo
14
Ini harus menjadi jawaban yang diterima karena mandiri (dalam pom.xml)
Vikram
2
Hai Rajarshee, id grup dan artefak sepenuhnya sewenang-wenang. Jalur ke jar Anda di sistem file adalah yang terpenting agar ini berfungsi. Karena pada kenyataannya toples bukanlah ketergantungan maven, Anda hanya menyuruh Maven untuk memperlakukannya seperti itu.
Ric Jafe
1
Pada 2016 ini sepertinya tidak berhasil. Build tersebut mengakui jalurnya tetapi tidak menyertakan kode dalam toples berbayang. Tikus ...
markthegrea
24

Buat folder repositori di bawah proyek Anda. Mari kita ambil

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

Kemudian, instal toples khusus Anda ke repo ini:

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

Terakhir, tambahkan definisi repo dan dependensi berikut ke project pom.xml:

<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>
mostar
sumber
1
Ini bekerja dengan sangat baik untuk saya. PS Saya akan merekomendasikan direktori yang berbeda untuk repo lokal karena meletakkannya di dalam "src" sepertinya tidak benar (ini bukan sumber!)
davidfrancis
1
Ini bekerja seperti pesona. Saya memindahkan proyek lama dari Ant ke Maven dan ada beberapa libs yang tidak dapat saya temukan di repo web.
Paulo Pedroso
Perhatian: ketika nilai untuk -DlocalRepositoryPath tidak diakhiri /(yaitu, menunjukkan folder), maka repo dia dibuat dengan groupId. Contoh: jika id grup adalah foo.comdan localRepositoryPath adalah repo, maka folder repo menjadi repo.foo.com.
Sheshadri Mantha
Prosedur ini adalah sebagai proyek lokal untuk manajemen repositori sistem menggunakan alat otomatisasi membangun maven yang digunakan terutama untuk proyek Java dan sistem file.
Oleksii Kyslytsyn
8

Anda perlu menyiapkan repositori lokal yang akan menjadi tuan rumah perpustakaan tersebut. Ada sejumlah proyek yang melakukan hal itu. Misalnya Artifactory .

Gregory Mostizky
sumber
4
Satu poin pada terminologi, itu adalah repositori jarak jauh internal, bukan repositori lokal. Repositori lokal adalah yang ada di tempat dependensi sistem file lokal diunduh.
Rich Seller
3

Tidak ada solusi yang berfungsi jika Anda menggunakan Jenkins build !! Saat pom dijalankan di dalam server build Jenkins .. solusi ini akan gagal, karena run pom Jenkins akan mencoba mendownload file ini dari repositori perusahaan.

Salin jars di bawah src / main / resources / lib (buat folder lib). Ini akan menjadi bagian dari proyek Anda dan terus berlanjut ke server penerapan. Di server penerapan, pastikan skrip startup Anda berisi src / main / resources / lib / * di classpath. Biola.

Apurva Singh
sumber
2

Anda dapat menginstalnya di repositori lokal pribadi (misalnya .m2 / repositori di bawah direktori home Anda): detail lebih lanjut di sini

dfa
sumber
7
Ya, saya bisa melakukannya, tetapi kemudian saya harus memberi tahu semua orang yang ingin membangun proyek bahwa dia harus meletakkan file X, Y di direktori Z dan itu benar-benar memperumit masalah. Lagi pula saya ingin menggunakan Maven untuk menyederhanakan proses build.
samson
2

Jika saya memahami dengan baik, jika yang ingin Anda lakukan adalah mengekspor dependensi selama fase kompilasi sehingga tidak perlu mengambil secara manual setiap library yang diperlukan, Anda dapat menggunakan mojo copy-dependencies .

Semoga dapat bermanfaat dalam kasus Anda ( contoh )

Erik Clairiot
sumber
2

Solusi @Ric Jafe adalah yang berhasil untuk saya.

Inilah yang saya cari. Cara untuk mendorongnya melalui kode pengujian penelitian. Tidak ada yang mewah. Ya, saya tahu itulah yang mereka semua katakan :) Berbagai solusi plugin maven tampaknya berlebihan untuk tujuan saya. Saya memiliki beberapa toples yang diberikan kepada saya sebagai lib pihak ketiga dengan file pom. Saya ingin kompilasi / dijalankan dengan cepat. Solusi yang saya sesuaikan dengan python ini bekerja dengan sangat baik bagi saya. Potong dan tempelkan ke pom saya. Kode Python / Perl untuk tugas ini ada di Q&A ini: Dapatkah saya menambahkan jars ke maven 2 membangun classpath tanpa menginstalnya?

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
Solusi di atas mengembalikan 'dependencies.dependency.systemPath' untuk xx.jar tidak boleh menunjuk ke file dalam direktori proyek. Lihat stackoverflow.com/questions/10935135/…
sarah.ferguson
1

Instal saja tidak berhasil untuk saya.

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
Jonathan Hendler
sumber