Bagaimana cara menambahkan file jar lokal ke proyek Maven?

1171

Bagaimana cara menambahkan file jar lokal (belum menjadi bagian dari repositori Maven) secara langsung di sumber perpustakaan proyek saya?

Praneel PIDIKITI
sumber
1
Hai @Praneel PIDIKITI, bisakah Anda mengubah jawaban yang diterima menjadi jawaban terbanyak?
null
1
@nslntmnx Itu tidak akan menjadi solusi yang lebih baik, karena semua solusi memiliki kekurangan stackoverflow.com/questions/364114/…
Paul Verest
Jika lib Anda diperbarui atau diperpanjang pada kesempatan lihat jawaban ini untuk Saya ingin memuat semua JAR dari folder proyek libs saya dengan maven untuk cara "pomified" dan menghindari folder repo tambahan dan garis cmd atau install-fileskrip yang rumit .
GeroldBroser mengembalikan Monica

Jawaban:

698

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

pengguna373455
sumber
7
Instruksi untuk menginstal pada build saya memiliki segalanya kecuali bagian generatePom. Itu tampaknya sangat penting.
Jason D
4
<path-to-file> apa artinya? Seperti C: / Pengguna /XXX/WorkspaceDocx/maven/src/main/resources/myJar.jar ...... atau dapatkah kita melakukan $ {project.basedir} /src/main/resources/myJar.jar
Igor Beaufils
17
Jawabannya tidak menyebutkan README atau bahwa toples dibawa. Namun, jika proyek membawa guci maka Anda mungkin juga meletakkan repo di proyek seperti yang disebutkan di sini stackoverflow.com/a/36602256/1000011 maka Anda tidak perlu untuk README karena proyek hanya akan berfungsi seolah-olah guci berada di tengah pakar tanpa langkah manual.
opticyclic
8
@opticyclic komentar Anda perlu lebih banyak upvotes, atau jawaban ini perlu diedit. Ini adalah resep bencana bagi pemula yang tidak menyadari bahwa memasang ke repo Maven lokal tidak akan termasuk untuk semua orang.
Mike S
3
Panduan
Nick Graham
1430

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

Alireza Fattahi
sumber
49
Ada saat-saat ketika Anda ingin secara khusus menguji stoples tua misalnya, dan saya pikir jawaban ini cocok untuk itu. Itu yang saya butuhkan. Terpilih
John Lockwood
36
Seindah dan semudah kelihatannya, solusi ini memiliki masalah bahwa jar.jar Anda tidak akan dimasukkan dalam file PERANG untuk aplikasi Anda.
Matthias
40
Solusi di atas tidak berfungsi lagi, ia mengembalikan: "'dependencies.dependency.systemPath' untuk xx.jar tidak boleh menunjuk ke file di dalam direktori proyek" Ini sudah ditangani di stackoverflow.com/questions/10935135/…
sarah .ferguson
8
Dalam jawaban ini, bukan artifactIddan groupIddengan cara yang salah di sekitar?
theonlygusti
5
Menurut Maven docu ( maven.apache.org/guides/introduction/... ): Catatan penting: Ini ditandai sudah usang.
Agassner
142

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.

JJ Roman
sumber
Direktori relatif lokal sebagai repo maven ... Banyak membantu
sura2k
4
Jika Anda ingin melakukan ini di pom.xml, periksa baeldung.com/install-local-jar-with-maven
Kai Wang
@ Kai Wang Solusi ini bekerja lebih baik! Anda mungkin harus menambahkan ini sebagai jawaban.
lockwobr
7
Karena ${project.parent.basedir}sepertinya tidak menyelesaikan apa pun saat ini saya menggunakan ${project.basedir}/..dan bekerja dengan sempurna.
The Impaler
1
Kiat: harap periksa $ HOME / .m2 / settings.xml , hindari "local-maven-repo" dicerminkan oleh pengaturan / mirror / mirror <mirrorOf>*</mirrorOf>.
btpka3
125

Buat folder baru, katakanlah local-maven-repodi 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]
Anthony O.
sumber
16
Ini adalah satu-satunya jawaban yang benar di sini karena itu akan membuat repo Anda dengan benar saat menggunakan deploy.
opticyclic
Apakah pendekatan ini berfungsi jika kode digunakan menggunakan server CI build? Sepertinya build otomatis tidak akan memiliki akses ke dependensi.
Wallace Howery
2
@ user2748659 ya jika di server build CI Anda folder local-maven-repodisertakan (sebagai anak dalam contoh ini) dalam folder sumber Anda
Anthony O.
3
Jawaban inilah yang berhasil bagi saya. Untuk proyek bersama, memiliki repo di direktori proyek dan ditambahkan ke kontrol versi memastikan bahwa siapa pun yang memeriksa proyek tidak akan memiliki dependensi yang hilang. Jika Anda memiliki banyak dependensi, maka repo yang dipakai bersama dan jarak jauh mungkin merupakan solusi yang lebih baik, jika tidak menyimpan repo di direktori proyek tidak menjadi masalah.
Aquarelle
2
Perhatikan bahwa untuk melakukan ini, Anda mungkin perlu menambahkan -Paket = toples. Kalau tidak, Anda mendapatkan "info artefak tidak lengkap atau tidak valid: kemasan tidak ada".
J Woodchuck
43

Saya ingin solusi seperti itu - gunakan maven-install-plugindalam 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 initializedan 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 initializemelangkah, tetapi langkah lain yang Anda suka.

sphinks
sumber
2
Ini berfungsi baik untuk saya, tetapi hanya jika saya menjalankan mvn initializesebelumnya mvn package: Saya tidak bisa mvn initialize packageatau ia mencoba mengunduh JAR dari repo pusat. Kenapa ini? Saya pikir ini akan menjalankan tujuan / fase ini secara berurutan.
DavidS
1
Sebenarnya, mereka harus dijalankan secara berurutan. Lihatlah daftar siklus hidup default: maven.apache.org/guides/introduction/… Anda dapat menggunakan langkah lain untuk mengikat.
sphinks
2
Saya mencoba setiap metode, tetapi pada akhirnya saya harus menggunakan solusi ini. Alasan utamanya adalah, saya ingin dapat membuat paket secara lokal dalam mode offline. Jika saya mendeklarasikannya sebagai ketergantungan dengan repositori yang ditentukan secara lokal, ini selalu dianggap hanya sebagai repo online dan maven build mengeluh karena tidak mendenda artefak. Solusi ini berfungsi dengan baik untuk setiap kasus.
Mauli
2
Saya pikir lebih baik menggunakan fase bersih karena inisialisasi akan dieksekusi setiap kali kita menggunakan paket mvn ketika itu tidak perlu. Akhirnya jika kita hanya perlu menghasilkan jar / perang kita dapat menggunakan langsung paket bersih mvn .
Deoxyseia
" Juga dimungkinkan untuk mengikat toples tidak untuk menginisialisasi langkah, tetapi langkah lain yang Anda suka. " Belum tentu benar. Jika dependensi belum dalam repo dan fase digunakan yang datang setelah fase yang menyelesaikan dependensi (misalnya compile) build akan gagal.
GeroldBroser mengembalikan Monica
29
<dependency>
    <groupId>group id name</groupId>
    <artifactId>artifact name</artifactId>
    <version>version number</version>
    <scope>system</scope>
    <systemPath>jar location</systemPath>
</dependency>
Satish Karuturi
sumber
6
<scope>systemsudah usang sekarang.
GeroldBroser mengembalikan Monica
@GoldenBroser - ok. apa yang bisa kita gunakan daripada itu?
MasterJoe2
2
@ MasterJoe2 Seperti juga disebutkan dalam jawaban yang diterima install:install-file , artefak untuk repo lokal dan menggunakannya sebagai dependensi "normal" (dengan lingkup default compile) atau menggunakan solusi repositori dalam proyek .
GeroldBroser mengembalikan Monica
14

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>
fl0w
sumber
Untuk URL repositori lokal, dapatkah itu relatif atau harus absolut?
Dragas
@ Dragas Saya belum mencoba, beri tahu kami jika Anda melakukannya.
fl0w
1
Ya, tampaknya Anda harus menggunakan <url>file:${basedir}</url>url dasar sebagai gantinya.
Dragas
11

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:

masukkan deskripsi gambar di sini

Tummidi Phani Kumar
sumber
Saya mendapatkan kesalahan Gagal menginstal artefak (akses ditolak). Bagaimana saya bisa memecahkan masalah ini? @Aurasphere
Ramzah Rehman
1
@RamzahRehman mencoba membuka command prompt dengan hak istimewa admi dengan mengklik kanan dan kemudian memilih "Run as administrator"
Aurasphere
9

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

Puce
sumber
4
Berakhir dengan beralih ke gradle. Ini tidak berfungsi. Jika toples lokal didefinisikan sebagai dependensi, maven tidak akan menjalankan plugins sebelum menyelesaikan dependensi, instalasi manual tidak dapat dihindari. menemukan diskusi tentang situasi ini: stackoverflow.com/questions/5951999/...
xinthink
6

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.

  1. Buat folder libs di proyek Anda
  2. 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>
  3. 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.

JeanValjean
sumber
6

garis komando :

mvn install:install-file -Dfile=c:\kaptcha-{version}.jar -DgroupId=com.google.code
-DartifactId=kaptcha -Dversion={version} -Dpackaging=jar
Hassani
sumber
5

Bagian penting dalam ketergantungan adalah: $ {pom.basedir} (bukan hanya $ {basedir})

<dependency>
    <groupId>org.example</groupId>
    <artifactId>example</artifactId>
    <version>1.0</version>
    <scope>system</scope>
    <systemPath>${pom.basedir}/src/lib/example.jar</systemPath>
</dependency>
kolle_86
sumber
4

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 pluginstambahkan 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 installatau mvn testguci lokal akan ditambahkan secara otomatis.

Sudara
sumber
3

Cara yang disukai adalah membuat repositori jarak jauh Anda sendiri.

Lihat di sini untuk detail tentang cara melakukannya. Lihat bagian ' Mengunggah ke Repositori Jarak Jauh '.

Simeon
sumber
3

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.

Luis Muzikant
sumber
Kode Anda 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?
javadba
Saya telah memperbaiki kode Anda: saya meletakkan jawaban di bagian bawah.
javadba
3

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

joro
sumber
2

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.

kervin
sumber
2

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.

Haroldo_OK
sumber
1

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.

jujur
sumber
1
jika Anda menambahkan guci di sistem kontrol sumber perpustakaan akan selalu tersedia bersama dengan sumbernya. Tidak ada sumber, tidak ada perpustakaan. Dengan maven, sumbernya mungkin ok tapi repositori tidak tersedia.
sarah.ferguson
@ Terus ... ada ide tentang cara membuat jar yang dapat dieksekusi tanpa menyertakan dependensi eksternal (file perpustakaan)?
Satish Karuturi
Untuk seseorang yang baru menjadi pakar, dan mencari jawaban untuk pertanyaan awal, apa yang dimaksud dengan "menanamkan toples"?
cdock
1

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

bpjoshi
sumber
1

Untuk menginstal tabung pihak ketiga, Silakan hubungi perintah seperti di bawah ini

mvn install:install-file -DgroupId= -DartifactId= -Dversion= -Dpackaging=jar -Dfile=path
Ravikiran Reddy Kotapati
sumber
1
  1. 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>
Mazen Embaby
sumber
1

Langkah 1: Konfigurasikan maven-install-plugindengan sasaran install-filedipom.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 filejalur 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-pluginseperti yang ditunjukkan di atas dalam pom.xmlfile Anda, Anda harus menggunakan guci ini pom.xmlseperti biasa:

    <dependency>
        <groupId>com.amazonservices.mws</groupId>
        <artifactId>mws-client</artifactId>
        <version>1.0</version>
    </dependency>

Perhatikan bahwa maven-install-pluginhanya 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.

Yatendra Goel
sumber
0

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.

Ranjan Rozario
sumber
0

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"

Kavindu Gayan
sumber
0
  1. Buat direktori repositori Maven lokal, root proyek Anda akan terlihat seperti ini sebagai permulaan:
yourproject
+- pom.xml
+- src
  1. Tambahkan direktori repositori Maven standar yang disebut repo untuk grup com.example dan versi 1.0:
yourproject
+- pom.xml
+- src
+- repo
  1. Menyebarkan Artefak ke dalam Repo, Maven dapat menggunakan artefak untuk Anda menggunakan mvn deploy: deploy-file goal:
mvn deploy:deploy-file -Durl=file:///pathtoyour/repo -Dfile=your.jar -DgroupId=your.group.id -DartifactId=yourid -Dpackaging=jar -Dversion=1.0
  1. instal file pom yang sesuai dengan jar Anda sehingga proyek Anda dapat menemukan jar selama pembuatan pakar dari repo lokal:
mvn install:install-file -Dfile=/path-to-your-jar-1.0.jar -DpomFile=/path-to-your-pom-1.0.pom
  1. tambahkan repo di file pom Anda:
<repositories>
    <!--other repositories if any-->
    <repository>
        <id>project.local</id>
        <name>project</name>
        <url>file:${project.basedir}/repo</url>
    </repository>
</repositories>
  1. tambahkan dependensi di pom Anda:
<dependency>
    <groupId>com.groupid</groupId>
    <artifactId>myid</artifactId>
    <version>1.0</version>
</dependency>
Dean Jain
sumber
-2

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

Anandkumar
sumber
5
Itu akan menambah entri ke Eclipse .classpath, tetapi maven build Anda mvn packageakan menjadi brokat setelah Anda mulai menggunakan dependensi itu, karena maven tidak memiliki definisi tentang itu, dan itu seharusnya hanya dipom.xml
Paul Verest
ya, Anda benar, paket tidak akan termasuk toples lokal. Tapi saya menjawab pertanyaan, bagaimana cara menambahkannya ke proyek (dengan cara gerhana).
Anandkumar