Bagaimana cara menambahkan file jar lokal (belum menjadi bagian dari repositori Maven) secara langsung di sumber perpustakaan proyek saya?
install-file
skrip yang rumit .
Bagaimana cara menambahkan file jar lokal (belum menjadi bagian dari repositori Maven) secara langsung di sumber perpustakaan proyek saya?
install-file
skrip yang rumit .
Jawaban:
Instal JAR ke dalam repositori Maven lokal Anda sebagai berikut:
mvn install:install-file \
-Dfile=<path-to-file> \
-DgroupId=<group-id> \
-DartifactId=<artifact-id> \
-Dversion=<version> \
-Dpackaging=<packaging> \
-DgeneratePom=true
Dimana masing-masing mengacu pada:
<path-to-file>
: path ke file untuk memuat mis → → c:\kaptcha-2.3.jar
<group-id>
: grup tempat file harus didaftarkan di bawah mis → → com.google.code
<artifact-id>
: nama artefak untuk file misalnya → kaptcha
<version>
: versi file mis. → 2.3
<packaging>
: pengemasan file mis. → jar
Referensi
install:install-file
TujuanAnda dapat menambahkan dependensi lokal secara langsung (seperti yang disebutkan dalam proyek pembangunan pakar dengan pustaka yang disertakan ) seperti ini:
<dependency>
<groupId>com.sample</groupId>
<artifactId>sample</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/Name_Your_JAR.jar</systemPath>
</dependency>
Memperbarui
Dalam rilis baru fitur ini ditandai sebagai usang tetapi masih berfungsi dan belum dihapus (Anda hanya melihat peringatan di log selama awal maven). Masalah muncul di maven group tentang ini https://issues.apache.org/jira/browse/MNG-6523 (Anda dapat berpartisipasi dan menjelaskan mengapa fitur ini membantu dalam beberapa kasus). Saya harap fitur ini tetap ada!
Jika Anda bertanya kepada saya, selama fitur tersebut tidak dihapus, saya menggunakan ini untuk membuat ketergantungan hanya pada satu file jar nakal di proyek saya yang tidak sesuai dengan repositori. Jika fitur ini dihapus, ya, ada banyak jawaban bagus di sini yang bisa saya pilih nanti!
artifactId
dan groupId
dengan cara yang salah di sekitar?
Pertama, saya ingin memberikan penghargaan untuk jawaban ini kepada pengguna Stack Overflow anonim - Saya cukup yakin saya telah melihat jawaban yang sama di sini sebelumnya - tetapi sekarang saya tidak dapat menemukannya.
Pilihan terbaik untuk memiliki file JAR lokal sebagai dependensi adalah membuat repositori Maven lokal. Repositori seperti itu tidak lebih dari struktur direktori yang tepat dengan file pom di dalamnya.
Sebagai contoh saya: Saya memiliki proyek master saya di ${master_project}
lokasi dan subproject1 aktif${master_project}/${subproject1}
.
Lalu saya membuat repositori Maven di:
${master_project}/local-maven-repo
.
Dalam file pom di subproject1 yang terletak di ${master_project}/${subproject1}/pom.xml
, repositori perlu ditentukan yang akan mengambil path file sebagai parameter URL:
<repositories>
<repository>
<id>local-maven-repo</id>
<url>file:///${project.parent.basedir}/local-maven-repo</url>
</repository>
</repositories>
Ketergantungan dapat ditentukan untuk repositori lainnya. Ini membuat repositori pom Anda independen. Misalnya, setelah JAR yang diinginkan tersedia di pusat Maven, Anda hanya perlu menghapusnya dari repo lokal Anda dan itu akan ditarik dari repo default.
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.servicebinder</artifactId>
<version>0.9.0-SNAPSHOT</version>
</dependency>
Hal terakhir yang tidak kalah penting adalah menambahkan file JAR ke repositori lokal menggunakan saklar -DlocalRepositoryPath seperti:
mvn org.apache.maven.plugins:maven-install-plugin:2.5.2:install-file \
-Dfile=/some/path/on/my/local/filesystem/felix/servicebinder/target/org.apache.felix.servicebinder-0.9.0-SNAPSHOT.jar \
-DgroupId=org.apache.felix -DartifactId=org.apache.felix.servicebinder \
-Dversion=0.9.0-SNAPSHOT -Dpackaging=jar \
-DlocalRepositoryPath=${master_project}/local-maven-repo
Setelah file JAR diinstal, repo Maven Anda dapat dikomit ke repositori kode, dan seluruh set-up adalah sistem yang independen. ( Contoh kerja di GitHub ).
Saya setuju bahwa memiliki JAR yang berkomitmen untuk repo kode sumber bukan praktik yang baik, tetapi dalam kehidupan nyata, solusi cepat dan kotor terkadang lebih baik daripada repo Nexus penuh untuk menampung satu JAR yang tidak dapat Anda terbitkan.
${project.parent.basedir}
sepertinya tidak menyelesaikan apa pun saat ini saya menggunakan ${project.basedir}/..
dan bekerja dengan sempurna.
<mirrorOf>*</mirrorOf>
.
Buat folder baru, katakanlah local-maven-repo
di akar proyek Maven Anda.
Cukup tambahkan repo lokal di dalam <project>
Anda pom.xml
:
<repositories>
<repository>
<id>local-maven-repo</id>
<url>file:///${project.basedir}/local-maven-repo</url>
</repository>
</repositories>
Kemudian untuk setiap tabung eksternal yang ingin Anda instal, buka root proyek Anda dan jalankan:
mvn deploy:deploy-file -DgroupId=[GROUP] -DartifactId=[ARTIFACT] -Dversion=[VERS] -Durl=file:./local-maven-repo/ -DrepositoryId=local-maven-repo -DupdateReleaseInfo=true -Dfile=[FILE_PATH]
local-maven-repo
disertakan (sebagai anak dalam contoh ini) dalam folder sumber Anda
Saya ingin solusi seperti itu - gunakan maven-install-plugin
dalam file pom:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
<executions>
<execution>
<phase>initialize</phase>
<goals>
<goal>install-file</goal>
</goals>
<configuration>
<file>lib/yourJar.jar</file>
<groupId>com.somegroup.id</groupId>
<artifactId>artefact-id</artifactId>
<version>x.y.z</version>
<packaging>jar</packaging>
</configuration>
</execution>
</executions>
</plugin>
Dalam hal ini Anda dapat melakukan mvn initialize
dan jar akan dipasang di repo pakar lokal. Sekarang toples ini tersedia selama langkah maven di mesin ini (jangan lupa untuk menyertakan dependensi ini seperti ketergantungan maven lainnya dalam pom dengan <dependency></dependency>
tag). Dimungkinkan juga untuk mengikat instalasi toples bukan untuk initialize
melangkah, tetapi langkah lain yang Anda suka.
mvn initialize
sebelumnya mvn package
: Saya tidak bisa mvn initialize package
atau ia mencoba mengunduh JAR dari repo pusat. Kenapa ini? Saya pikir ini akan menjalankan tujuan / fase ini secara berurutan.
compile
) build akan gagal.
<dependency>
<groupId>group id name</groupId>
<artifactId>artifact name</artifactId>
<version>version number</version>
<scope>system</scope>
<systemPath>jar location</systemPath>
</dependency>
<scope>system
sudah usang sekarang.
install:install-file
, artefak untuk repo lokal dan menggunakannya sebagai dependensi "normal" (dengan lingkup default compile
) atau menggunakan solusi repositori dalam proyek .
Ya, Anda dapat memiliki tetapi itu bukan ide yang bagus.
Alih-alih instal semua toples ini ke pakar repo
Lihat juga
Cara yang sangat cepat dan kotor adalah dengan menunjuk ke file lokal:
<dependency>
<groupId>sample</groupId>
<artifactId>com.sample</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>C:\DEV\myfunnylib\yourJar.jar</systemPath>
</dependency>
Namun ini hanya akan hidup pada mesin Anda (jelas), untuk berbagi biasanya masuk akal untuk menggunakan arsip m2 yang tepat (nexus / artifactory) atau jika Anda tidak memiliki ini atau tidak ingin mengaturnya menjadi pakar lokal arsip terstruktur dan konfigurasikan "repositori" di pom Anda: local:
<repositories>
<repository>
<id>my-local-repo</id>
<url>file://C:/DEV//mymvnrepo</url>
</repository>
</repositories>
terpencil:
<repositories>
<repository>
<id>my-remote-repo</id>
<url>http://192.168.0.1/whatever/mavenserver/youwant/repo</url>
</repository>
</repositories>
untuk ini jalur relatif juga dimungkinkan menggunakan variabel basedir:
<url>file:${basedir}</url>
<url>file:${basedir}</url>
url dasar sebagai gantinya.
Tambahkan JAR lokal Anda sendiri di file POM dan gunakan itu di maven build.
mvn install:install-file -Dfile=path-to-jar -DgroupId=owngroupid -DartifactId=ownartifactid -Dversion=ownversion -Dpackaging=jar
Sebagai contoh:
mvn install:install-file -Dfile=path-to-jar -DgroupId=com.decompiler -DartifactId=jd-core-java -Dversion=1.2 -Dpackaging=jar
Kemudian tambahkan ke POM seperti ini:
Salah satu caranya adalah mengunggahnya ke pengelola repositori Maven Anda sendiri (seperti Nexus). Praktek yang baik untuk memiliki manajer repositori sendiri.
Cara bagus lain yang baru-baru ini saya lihat adalah memasukkan Plugin Maven Install ke dalam siklus hidup build Anda: Anda mendeklarasikan dalam POM untuk menginstal file ke repositori lokal. Ini sedikit tetapi overhead kecil dan tidak ada langkah manual yang terlibat.
http://maven.apache.org/plugins/maven-install-plugin/install-file-mojo.html
Tentu saja Anda dapat menambahkan toples ke folder itu. Tapi mungkin bukan itu yang ingin Anda raih ...
Jika Anda membutuhkan botol ini untuk kompilasi, periksa pertanyaan terkait ini: Dapatkah saya menambahkan guci ke maven 2 build classpath tanpa menginstalnya?
Juga, sebelum ada yang menyarankan, JANGAN gunakan lingkup sistem.
Kasus lain yang menarik adalah ketika Anda ingin memiliki guci pakar pribadi di proyek Anda. Anda mungkin ingin mempertahankan kemampuan Maven untuk menyelesaikan dependensi transitif. Solusinya cukup mudah.
Tambahkan baris berikut dalam file pom.xml Anda
<properties><local.repository.folder>${pom.basedir}/libs/</local.repository.folder>
</properties>
<repositories>
<repository>
<id>local-maven-repository</id>
<url>file://${local.repository.folder}</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
Buka folder .m2 / repositori dan salin struktur direktori proyek yang ingin Anda impor ke folder libs .
Misalkan Anda ingin mengimpor ketergantungan
<dependency>
<groupId>com.mycompany.myproject</groupId>
<artifactId>myproject</artifactId>
<version>1.2.3</version>
</dependency>
Hanya pergi pada .m2 / repositori dan Anda akan melihat folder berikut
com / mycompany / myproject / 1.2.3
Salin semua yang ada di folder libs Anda (sekali lagi, termasuk folder di bawah .m2 / repositori ) dan Anda selesai.
Saya pikir solusi yang lebih baik untuk masalah ini adalah menggunakan maven-install-plugin untuk secara otomatis menginstal file pada waktu instalasi. Ini adalah bagaimana saya mengaturnya untuk proyek saya.
Pertama, tambahkan path (tempat Anda menyimpan .jars lokal) sebagai properti.
<properties>
<local.sdk>/path/to/jar</local.sdk>
</properties>
Kemudian, di bawah plugins
tambahkan plugin untuk menginstal stoples saat kompilasi.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
<executions>
<execution>
<id>1</id>
<phase>initialize</phase>
<goals>
<goal>install-file</goal>
</goals>
<configuration>
<groupId>com.local.jar</groupId>
<artifactId>appengine-api</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<file>${local.sdk}/lib/impl/appengine-api.jar</file>
</configuration>
</execution>
<execution>
<id>appengine-api-stubs</id>
<phase>initialize</phase>
<goals>
<goal>install-file</goal>
</goals>
<configuration>
<groupId>com.local.jar</groupId>
<artifactId>appengine-api-stubs</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<file>${local.sdk}/lib/impl/appengine-api-stubs.jar</file>
</configuration>
</execution>
</executions>
</plugin>
Akhirnya, dalam dependensi, Anda bisa menambahkan toples
<dependency>
<groupId>com.local.jar</groupId>
<artifactId>appengine-api</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>com.local.jar</groupId>
<artifactId>appengine-api-stubs</artifactId>
<version>1.0</version>
<scope>test</scope>
</dependency>
Dengan Menyiapkan proyek Anda seperti ini, proyek akan terus membangun bahkan ketika Anda membawanya ke komputer lain (mengingat bahwa ia memiliki semua file jar di jalur yang ditentukan oleh properti local.sdk
).
Untuk groupId
menggunakan nama yang unik hanya untuk memastikan bahwa tidak ada konflik.
Sekarang ketika Anda mvn install
atau mvn test
guci lokal akan ditambahkan secara otomatis.
Saya ingin membagikan kode tempat Anda dapat mengunggah folder yang penuh dengan stoples. Ini berguna ketika penyedia tidak memiliki repositori publik dan Anda perlu menambahkan banyak perpustakaan secara manual. Saya telah memutuskan untuk membangun .bat alih-alih memanggil langsung ke pakar karena bisa jadi Kesalahan Memori. Itu disiapkan untuk lingkungan windows tetapi mudah untuk beradaptasi dengan OS linux:
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.jar.Attributes;
import java.util.jar.JarFile;
import java.util.jar.Manifest;
public class CreateMavenRepoApp {
private static final String OCB_PLUGIN_FOLDER = "C://your_folder_with_jars";
public static void main(String[] args) throws IOException {
File directory = new File();
//get all the files from a directory
PrintWriter writer = new PrintWriter("update_repo_maven.bat", "UTF-8");
writer.println("rem "+ new Date());
File[] fList = directory.listFiles();
for (File file : fList){
if (file.isFile()){
String absolutePath = file.getAbsolutePath() ;
Manifest m = new JarFile(absolutePath).getManifest();
Attributes attributes = m.getMainAttributes();
String symbolicName = attributes.getValue("Bundle-SymbolicName");
if(symbolicName!=null &&symbolicName.contains("com.yourCompany.yourProject")) {
String[] parts =symbolicName.split("\\.");
String artifactId = parts[parts.length-1];
String groupId = symbolicName.substring(0,symbolicName.length()-artifactId.length()-1);
String version = attributes.getValue("Bundle-Version");
String mavenLine= "call mvn org.apache.maven.plugins:maven-install-plugin:2.5.1:install-file -Dfile="+ absolutePath+" -DgroupId="+ groupId+" -DartifactId="+ artifactId+" -Dversion="+ version+" -Dpackaging=jar ";
writer.println(mavenLine);
}
}
}
writer.close();
}
}
Setelah menjalankan main ini dari IDE apa pun, jalankan update_repo_maven.bat.
String symbolicName = attributes.getValue("Bundle-SymbolicName"); if(symbolicName!=null &&symbolicName.contains("com.yourCompany.yourProject"))
tampaknya menunjukkan bahwa hanya guci khusus yang akan didukung. Bukan itu yang kita butuhkan: melainkan sekelompok guci pihak ketiga. Apakah Anda punya saran cara memasang tabung apa pun dengan cara ini?
Ini adalah sintaks pendek untuk versi yang lebih baru:
mvn install:install-file -Dfile=<path-to-file>
Ini berfungsi ketika JAR dibangun oleh Apache Maven - kasus yang paling umum. Maka itu akan berisi pom.xml dalam subfolder dari direktori META-INF, yang akan dibaca secara default.
Sumber: http://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html
Juga lihat ...
<scope>compile</scope>
Ketergantungan Maven . Ini adalah default tetapi saya telah menemukan dalam beberapa kasus secara eksplisit menetapkan lingkup itu juga Maven untuk menemukan perpustakaan lokal di repositori lokal.
Untuk beberapa alasan, dalam aplikasi web saya memberikan perawatan, baik solusi Alireza Fattahi maupun solusi JJ Roman bekerja dengan benar. Dalam kedua kasus, kompilasi berjalan baik (ia melihat toples), tetapi kemasan gagal memasukkan toples ke dalam perang.
Satu-satunya cara saya berhasil membuatnya adalah dengan meletakkan stoples /src/main/webapp/WEB-INF/lib/
dan kemudian menggabungkannya dengan solusi Fattahis atau Romawi.
Perhatikan bahwa TIDAK selalu merupakan ide yang baik untuk menggunakan repo lokal. Jika proyek ini dibagikan kepada orang lain maka semua orang akan memiliki masalah dan pertanyaan ketika itu tidak berhasil, dan toples tidak akan tersedia bahkan di sistem kontrol sumber Anda!
Meskipun repo bersama adalah jawaban terbaik, jika Anda tidak dapat melakukan ini karena suatu alasan maka menanamkan toples lebih baik daripada repo lokal. Konten repo khusus lokal dapat menyebabkan banyak masalah, terutama seiring waktu.
Di repositori lokal Anda, Anda dapat memasang toples Anda dengan mengeluarkan perintah
mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> \
-DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>
Ikuti tautan bermanfaat ini untuk melakukan hal yang sama dari situs web mkyoung. Anda juga dapat memeriksa panduan pakar untuk hal yang sama
Untuk menginstal tabung pihak ketiga, Silakan hubungi perintah seperti di bawah ini
mvn install:install-file -DgroupId= -DartifactId= -Dversion= -Dpackaging=jar -Dfile=path
- mvn instal
Anda dapat menulis kode di bawah ini di baris perintah atau jika Anda menggunakan gerhana klik kanan pada proyek -> Run As -> jalankan konfigurasi ... -> di klik kanan panel kiri pada Maven Build -> konfigurasi baru -> tulis kode di Sasaran & di direktori dasar: $ {project_loc: NameOfYourProject} -> Jalankan
mvn install:install-file
-Dfile=<path-to-file>
-DgroupId=<group-id>
-DartifactId=<artifact-id>
-Dversion=<version>
-Dpackaging=<packaging>
-DgeneratePom=true
Dimana masing-masing mengacu pada:
<path-to-file>: path ke file untuk memuat mis - -> c: \ kaptcha-2.3.jar
<group-id>: grup tempat file itu harus didaftarkan, misalnya - - com.google.code
<artifact-id>: nama artefak untuk file mis - -> kaptcha
<version>: versi file mis - -> 2.3
<packaging>: kemasan file mis - -> toples
2.Setelah diinstal, cukup nyatakan stoples di pom.xml.
<dependency>
<groupId>com.google.code</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3</version>
</dependency>
Langkah 1: Konfigurasikan maven-install-plugin
dengan sasaran install-file
dipom.xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<executions>
<execution>
<id>install-external-non-maven-jar-MWS-Client-into-local-maven-repo</id>
<phase>clean</phase>
<configuration>
<repositoryLayout>default</repositoryLayout>
<groupId>com.amazonservices.mws</groupId>
<artifactId>mws-client</artifactId>
<version>1.0</version>
<file>${project.basedir}/lib/MWSClientJavaRuntime-1.0.jar</file>
<packaging>jar</packaging>
<generatePom>true</generatePom>
</configuration>
<goals>
<goal>install-file</goal>
</goals>
</execution>
</executions>
</plugin>
Pastikan untuk mengedit file
jalur berdasarkan jalur file Anda yang sebenarnya (disarankan untuk menempatkan guci non-pakar eksternal ini di dalam beberapa folder, katakanlah lib
, dan tempatkan inilib
folder di dalam proyek Anda sehingga dapat menggunakan jalur relatif spesifik proyek dan menghindari penambahan sistem jalur absolut spesifik.
Jika Anda memiliki beberapa guci eksternal, cukup ulangi <execution>
untuk guci lainnya dalam yang samamaven-install-plugin
.
Langkah 2: Setelah Anda mengkonfigurasi maven-install-plugin
seperti yang ditunjukkan di atas dalam pom.xml
file Anda, Anda harus menggunakan guci ini pom.xml
seperti biasa:
<dependency>
<groupId>com.amazonservices.mws</groupId>
<artifactId>mws-client</artifactId>
<version>1.0</version>
</dependency>
Perhatikan bahwa maven-install-plugin
hanya menyalin guci eksternal Anda ke lokal Anda.m2
repositori pakar . Itu dia. Itu tidak secara otomatis memasukkan botol ini sebagai ketergantungan maven ke proyek Anda.
Ini poin kecil, tapi terkadang mudah dilewatkan.
Saya memiliki kesalahan yang sama untuk satu set dependensi di pom.xml saya ternyata versi dependensi tidak ditentukan dalam pom.xml dan disebutkan dalam repositori induk. Untuk beberapa alasan detail versi tidak disinkronkan dengan repo ini. Karenanya saya secara manual memasukkan versi menggunakan tag dan itu bekerja seperti pesona. Sedikit waktu yang diperlukan untuk mencari versi di induk dan tentukan di sini. Tapi ini bisa dilakukan hanya untuk stoples yang menunjukkan kesalahan artifactid dan berfungsi. Semoga ini bisa membantu seseorang.
Di Apache Maven 3.5.4, saya harus menambahkan kutip ganda. Tanpa kutip ganda, itu tidak berhasil untuk saya.
contoh: mvn install: install-file "-Dfile = lokasi ke file jar" "-DgroupId = grup id" "-DartifactId = artifact id" "-Dversion = versi" "-Dpackaging = jenis paket"
yourproject
+- pom.xml
+- src
yourproject
+- pom.xml
+- src
+- repo
mvn deploy:deploy-file -Durl=file:///pathtoyour/repo -Dfile=your.jar -DgroupId=your.group.id -DartifactId=yourid -Dpackaging=jar -Dversion=1.0
mvn install:install-file -Dfile=/path-to-your-jar-1.0.jar -DpomFile=/path-to-your-pom-1.0.pom
<repositories>
<!--other repositories if any-->
<repository>
<id>project.local</id>
<name>project</name>
<url>file:${project.basedir}/repo</url>
</repository>
</repositories>
<dependency>
<groupId>com.groupid</groupId>
<artifactId>myid</artifactId>
<version>1.0</version>
</dependency>
JAWABAN INI HANYA UNTUK PENGGUNA ECLIPSE:
Jika Anda menggunakan Eclipse, tempatkan toples di lib /, klik kanan pada nama toples dan klik "add to build path". Eclipse akan membuat "pustaka yang direferensikan" dan menempatkan toples untuk Anda
Itu menyelesaikan impor toples segera di program untuk saya
.classpath
, tetapi maven build Anda mvn package
akan menjadi brokat setelah Anda mulai menggunakan dependensi itu, karena maven tidak memiliki definisi tentang itu, dan itu seharusnya hanya dipom.xml