Bagaimana cara menambah local file jar (belum menjadi bagian dari repository Maven) langsung di proyek saya's perpustakaan sumber?
Anda dapat menambahkan lokal dependensi secara langsung (seperti yang disebutkan di https://stackoverflow.com/questions/4491199/build-maven-project-with-propriatery-libraries-included/4491343#4491343) 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>
Update
Dalam rilis baru ini fitur ditandai sebagai usang tapi masih bekerja dan tidak dihapus lagi ( Anda hanya melihat peringatan di log selama maven mulai). Masalah yang diangkat pada maven kelompok tentang hal ini https://issues.apache.org/jira/browse/MNG-6523 ( Anda dapat berpartisipasi dan menjelaskan mengapa fitur ini sangat membantu dalam beberapa kasus). Saya berharap fitur ini tetap ada!
Jika anda bertanya kepada saya, asalkan fitur ini tidak dihapus, saya menggunakan ini untuk membuat ketergantungan hanya satu nakal file jar di proyek saya yang tidak cocok di repositori. Jika fitur ini dihapus, nah, ada banyak jawaban yang baik di sini yang saya dapat memilih dari nanti!
Menginstal JAR ke local repository Maven sebagai berikut:
mvn install:install-file \
-Dfile=<path-to-File> \
-DgroupId=<group-id> \
-DartifactId=<artifact-id> \
-Dversion=<version> \
-Dpackaging=<packaging> \
-DgeneratePom=true
Di mana masing-masing mengacu pada:
<jalan-ke-file>
: path ke file untuk memuat e.g → c:\kaptcha-2.3.jar
<kelompok-id>
: kelompok yang file harus terdaftar di bawah e.g → com.google.kode
<artefak-id>
: artefak nama file e.g → kaptcha
<versi>
: versi file e.g → 2.3
<kemasan>
: kemasan file misalnya → jar
Referensi
Pertama, saya ingin memberikan kredit untuk jawaban ini untuk anonim Stack Overflow pengguna - saya cukup yakin saya've melihat jawaban serupa di sini sebelum tapi sekarang aku tidak bisa menemukannya.
Pilihan terbaik untuk memiliki setempat file JAR seperti ketergantungan adalah untuk membuat lokal repository Maven. Seperti repositori adalah tidak lebih dari sebuah tepat struktur direktori dengan pom file di dalamnya.
Untuk contoh saya:
Saya punya master proyek ${master_project}
lokasi dan subproject1 adalah pada ${master_project}/${subproject1}
.
Kemudian saya membuat sebuah repository Maven di:
${master_project}/lokal-maven-repo
.
Di pom file di subproject1 terletak di ${master_project}/${subproject1}/pom.xml
, repositori harus ditentukan yang akan mengambil file path 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 setiap lain repositori. Hal ini membuat pom repositori independen. Misalnya, setelah yang diinginkan JAR tersedia dalam Maven central, anda hanya perlu untuk menghapus repo lokal dan itu akan ditarik dari default repo.
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.servicebinder</artifactId>
<version>0.9.0-SNAPSHOT</version>
</dependency>
Terakhir namun tidak sedikit hal yang harus lakukan adalah untuk menambahkan file JAR ke repositori lokal menggunakan -DlocalRepositoryPath beralih 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, anda Maven repo dapat berkomitmen untuk kode repositori, dan seluruh set-up sistem independen. (Contoh kerja di GitHub).
Saya setuju bahwa memiliki Guci berkomitmen untuk source code repo ini bukan praktik yang baik, tetapi dalam kehidupan nyata, cepat dan kotor solusi yang kadang-kadang lebih baik daripada penuh ditiup Nexus repo untuk menjadi tuan rumah salah satu JAR bahwa anda tidak dapat mempublikasikan.
Membuat folder baru, let's mengatakan lokal-maven-repo
di akar Maven project.
Hanya menambahkan repo lokal dalam <proyek>
anda pom.xml
:
<repositories>
<repository>
<id>local-maven-repo</id>
<url>file:///${project.basedir}/local-maven-repo</url>
</repository>
</repositories>
Kemudian untuk masing-masing eksternal jar yang anda inginkan untuk menginstal, pergi pada akar dari 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]
I'd seperti solusi - menggunakan maven-menginstal-plugin
di pom file:
<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 menginisialisasi
dan jar akan dipasang di daerah maven repo. Sekarang toples ini tersedia selama maven langkah pada mesin ini (jangan lupa untuk menyertakan ketergantungan ini seperti yang lain maven ketergantungan di badan pom dengan <ketergantungan></ketergantungan>
tag). Hal ini juga memungkinkan untuk mengikat jar instal tidak untuk memulai
langkah, tapi langkah lain yang anda suka.
Ya , anda dapat memiliki, tapi bukan ide yang baik.
Alih-alih menginstal semua guci ini untuk maven repos
Lihat Juga
Salah satu cara adalah dengan meng-upload ke anda sendiri repository Maven manager (seperti Nexus). It's praktek yang baik untuk memiliki repositori sendiri manajer pula.
Lain cara yang baik saya'baru saja dilihat adalah termasuk Maven Menginstal Plugin dalam membangun siklus hidup: Anda menyatakan di POM untuk menginstal file ke repositori lokal. It's sedikit tapi kecil overhead dan tidak ada langkah manual yang terlibat.
http://maven.apache.org/plugins/maven-install-plugin/install-file-mojo.html
Benar-benar cepat dan cara kotor adalah untuk 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 hal ini hanya akan live pada mesin anda (jelas), untuk berbagi itu biasanya masuk akal untuk penggunaan yang tepat m2 arsip (nexus/artifactory) atau jika anda tidak memiliki salah satu dari ini atau don't ingin menetapkan satu up lokal maven terstruktur arsip dan mengkonfigurasi "repositori" di pom: lokal:
<repositories>
<repository>
<id>my-local-repo</id>
<url>file://C:/DEV//mymvnrepo</url>
</repository>
</repositories>
remote:
<repositories>
<repository>
<id>my-remote-repo</id>
<url>http://192.168.0.1/whatever/mavenserver/youwant/repo</url>
</repository>
</repositories>
untuk ini path relatif adalah juga mungkin menggunakan basedir variabel:
<url>file:${basedir}</url>
Tambahkan anda sendiri lokal JAR di POM file dan menggunakannya dalam maven membangun.
mvn install:install-file -Dfile=path-to-jar -DgroupId=owngroupid -DartifactId=ownartifactid -Dversion=ownversion -Dpackaging=jar
Misalnya:
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:
Tentu saja anda dapat menambahkan guci ke folder itu. Tapi mungkin itu tidak apa yang ingin anda capai...
Jika anda membutuhkan guci ini untuk kompilasi, pemeriksaan ini terkait dengan pertanyaan: https://stackoverflow.com/questions/364114/can-i-add-jars-to-maven-2-build-classpath-without-installing-them/
Juga, sebelum ada yang menunjukkan hal itu, jangan gunakan ruang lingkup sistem.
Hal lain yang menarik adalah ketika anda ingin memiliki dalam proyek anda pribadi maven botol. Anda mungkin ingin menjaga kemampuan Maven untuk mengatasi ketergantungan transitif. Solusi ini cukup mudah.
E. g. misalkan anda ingin mengimpor ketergantungan
<dependency>
<groupId>com.mycompany.myproject</groupId>
<artifactId>myproject</artifactId>
<version>1.2.3</version>
</dependency>
Hanya pergi .m2/repositori dan anda akan melihat folder berikut
com/mycompany/myproject/1.2.3
Copy semua folder libs (lagi, termasuk folder di bawah .m2/repositori) dan anda selesai.
Saya pikir solusi yang lebih baik untuk masalah ini adalah dengan menggunakan maven-menginstal-plugin untuk secara otomatis menginstal file pada waktu menginstal. Ini adalah bagaimana saya mengaturnya untuk proyek saya.
Pertama, tambahkan path (di mana anda menyimpan setempat .guci) sebagai properti.
<properties>
<local.sdk>/path/to/jar</local.sdk>
</properties>
Kemudian, di bawah plugins
menambahkan plugin untuk menginstal botol 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 dapat menambahkan guci
<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 seperti ini, proyek akan terus membangun bahkan ketika anda membawanya ke komputer lain (mengingat bahwa ia memiliki semua file jar di jalan yang ditentukan oleh properti lokal.sdk
).
Untuk groupId
gunakan nama yang unik hanya untuk memastikan bahwa tidak ada konflik.
Sekarang ketika anda mvn install
atau mvn test
lokal botol akan ditambahkan secara otomatis.
Cara yang lebih disukai akan membuat anda sendiri repositori jauh.
Lihat di sini untuk rincian tentang bagaimana untuk melakukan itu. Lihat 'meng-Upload ke Remote Repository' bagian.
Saya ingin berbagi kode di mana anda dapat meng-upload folder penuh botol. It's berguna ketika penyedia doesn't memiliki repositori umum dan anda perlu menambahkan banyak perpustakaan secara manual. I've memutuskan untuk membangun sebuah .bat bukan panggilan langsung ke maven karena Itu bisa Keluar dari kesalahan Memori. Hal ini disiapkan untuk lingkungan windows, tapi lebih 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 utama dari setiap IDE, menjalankan update_repo_maven.bat.
Ini adalah sintaks untuk versi yang lebih baru:
mvn install:install-file -Dfile=<path-to-File>
Ia bekerja ketika JAR dibangun oleh Apache Maven - kasus yang paling umum. Maka itu'll mengandung pom.xml dalam subfolder dari META-INF direktori, yang akan dibaca oleh default.
Sumber: http://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html
Perhatikan bahwa hal ini TIDAK selalu ide yang baik untuk menggunakan repo lokal. Jika proyek ini bersama dengan orang lain maka orang lain akan memiliki masalah dan pertanyaan ketika itu doesn't bekerja, dan jar won't akan tersedia bahkan dalam sistem kontrol sumber!
Meskipun bersama repo adalah jawaban terbaik, jika anda tidak melakukan ini untuk beberapa alasan maka embedding jar lebih baik dari repo lokal. Lokal-hanya repo isi dapat menyebabkan banyak masalah, terutama dari waktu ke waktu.
Pada repositori lokal anda dapat menginstal jar anda dengan mengeluarkan perintah
mvn install:install-file -Dfile=<path-to-File> -DgroupId=<group-id> \
-DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>
Ikuti berguna ini link untuk melakukan hal yang sama dari mkyoung's web. Anda juga dapat memeriksa maven panduan untuk sama