Maven dan menambahkan JAR ke cakupan sistem


86

Saya memiliki JAR di proyek Android saya dan saya ingin itu ditambahkan ke APK akhir. Oke, ini dia:

    <dependency>
        <groupId>com.loopj.android.http</groupId>
        <artifactId>android-async-http</artifactId>
        <version>1.3.2</version>
        <type>jar</type>
        <scope>system</scope>
        <systemPath>${project.basedir}/libs/android-async-http-1.3.2.jar</systemPath>
    </dependency>

Tapi saat saya berlari, mvn packagesaya mendapat peringatan:

[WARNING] Some problems were encountered while building the effective model for **apk:1.0
[WARNING] 'dependencies.dependency.systemPath' for com.loopj.android.http:android-async-http:jar should not point at files within the project directory, ${project.basedir}/libs/android-async-http-1.3.2.jar will be unresolvable by dependent projects @ line 36, column 25

Dan di APK final tidak ada JAR.

Bagaimana cara memperbaikinya?


3
Anda tidak dapat menggunakan cakupan sistem dengan cara ini. gunakan install: install-file.
bmargulies

@bmargulies Bisakah Anda mengatakan untuk apa cakupan ini?
Efpies

1
Saya beralih ke gradle dan tidak mengalami sakit kepala ini lagi kecuali sekarang saya mencoba menggunakan perpustakaan open source dengan maven dan untuk sementara meretas stoples (yang begitu mudah di gradle dan sangat sulit di maven).
Dean Hiller

1
Pertanyaan ini membahas tentang cara menghindari penggunaan cakupan sistem di Maven: stackoverflow.com/questions/3642023/…
Mark Butler

Dokumentasi resmi tentang 'sistem' ruang lingkup: maven.apache.org/guides/introduction/…
Guillaume Husta

Jawaban:


24

Anda perlu menambahkan toples ke repositori maven lokal Anda. Alternatifnya (opsi yang lebih baik) tentukan repositori yang tepat (jika ada) sehingga dapat diunduh secara otomatis oleh maven

Dalam kedua kasus tersebut, hapus <systemPath>tag dari ketergantungan


4
Saya telah melihat artikel itu tetapi saya berharap tidak melakukannya maven installdi setiap komputer tempat saya ingin membangun proyek itu (sayangnya saya tidak menemukan JAR ini di repo). Terima kasih! :)
efpies

1
Itu dapat dibuat skrip sebagai bagian dari build.
Thorbjørn Ravn Andersen

145

Saya tidak tahu alasan sebenarnya tetapi Maven mendorong pengembang untuk menginstal semua perpustakaan (juga kustom) ke dalam beberapa repositori maven, jadi scope:systemtidak terlalu disukai, Solusi sederhana adalah dengan menggunakanmaven-install-plugin

ikuti penggunaannya:

tulis ketergantungan Anda dengan cara ini

<dependency>
    <groupId>com.mylib</groupId>
    <artifactId>mylib-core</artifactId>
    <version>0.0.1</version>
</dependency>

lalu, tambahkan maven-install-plugin

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-install-plugin</artifactId>
    <version>2.5.2</version>
    <executions>
        <execution>
            <id>install-external</id>
            <phase>clean</phase>
            <configuration>
                <file>${basedir}/lib/mylib-core-0.0.1.jar</file>
                <repositoryLayout>default</repositoryLayout>
                <groupId>com.mylib</groupId>
                <artifactId>mylib-core</artifactId>
                <version>0.0.1</version>
                <packaging>jar</packaging>
                <generatePom>true</generatePom>
            </configuration>
            <goals>
                <goal>install-file</goal>
            </goals>
        </execution>
    </executions>
</plugin>

perhatikan phase:clean, untuk menginstal pustaka kustom Anda ke dalam repositori, Anda harus menjalankan mvn cleandan kemudianmvn install


10
Mengapa tidak digunakan <phase>process-resources</phase>sebagai gantinya <phase>clean</phase>. Fase sumber daya proses terlihat lebih sesuai untuk skenario seperti itu dan selalu dipanggil sebelum fase kompilasi.
jplandrain

1
pada penginstalan pertama, apakah Anda yakin dapat melewati fase 'validasi' yang terjadi sebelum sumber daya proses dalam 'siklus hidup bawaan'? ; ), 'siklus hidup bersih' menjadi yang pertama 'siklus hidup yang dibangun' dan tidak bergantung pada validasi apa pun, tutorialspoint.com/maven/maven_build_life_cycle.htm
Ging3r

5
Ini berfungsi, tetapi bagaimana Anda menginstal beberapa dependensi?
Renaud Pawlak

6
Stackoverflow harus menambahkan fitur yang memungkinkan komunitas untuk menimpa pilihan OP atas jawaban yang benar, karena IMHO, Jawaban ini haruslah yang diterima! :)
Vijay Chavda

2
Seperti yang dikomentari orang lain, mengikat ke cleanfase sangat menyesatkan, itu bukan bagian dari siklus hidup default, dan mendistorsi artinya clean. Lebih lanjut, perubahan yang disarankan untuk menggunakan fase dalam siklus hidup default (misalnya validateatau process-resources) akan gagal dalam situasi multi-modul, karena resolusi ketergantungan dicoba oleh aggregator, sebelum tujuan kustom apa pun yang dijalankan untuk modul anak.
wool.in.silver

14
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <includeSystemScope>true</includeSystemScope>
    </configuration>
</plugin>

Coba ini.


11

Cakupan sistem hanya dirancang untuk menangani file 'sistem'; file duduk di beberapa lokasi tetap. File dalam /usr/lib, atau ${java.home}(mis tools.jar.). Itu tidak dirancang untuk mendukung .jarfile lain-lain dalam proyek Anda.

Penulis dengan sengaja menolak untuk membuat perluasan nama jalur berfungsi dengan benar untuk itu untuk membuat Anda putus asa. Hasilnya, dalam jangka pendek Anda dapat menggunakan install:install-fileuntuk menginstal ke repo lokal, dan kemudian suatu hari menggunakan manajer repo untuk berbagi.


3

Gunakan manajer repositori dan instal toples semacam ini ke dalamnya. Itu memecahkan masalah Anda sama sekali dan untuk semua komputer di jaringan Anda.


3
Kami berencana untuk menjalankan repo di server lokal besok atau lusa tetapi sebelum itu saya harus menyelesaikan masalah ini dengan cara lain.
Efpies

1
Seperti yang disebutkan @efpies, ini mungkin jawaban yang luar biasa ketika pengembang tidak memiliki izin / kemampuan untuk membuat manajer repo.
StephenBoesch

Hari-hari ini, jika Anda telah menginstal buruh pelabuhan semua yang Anda butuhkan adalah docker run -d -p 8081:8081 --name nexus sonatype/nexus3- lihat hub.docker.com/r/sonatype/nexus3 untuk detailnya.
Thorbjørn Ravn Andersen

3

Coba konfigurasi ini. Ini berhasil untuk saya:

<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <warSourceDirectory>mywebRoot</warSourceDirectory>
        <warSourceExcludes>source\**,build\**,dist\**,WEB-INF\lib\*,
            WEB-INF\classes\**,build.*
        </warSourceExcludes>
        <webXml>myproject/source/deploiement/web.xml</webXml>
        <webResources>
            <resource>
                <directory>mywebRoot/WEB-INF/lib</directory>
                <targetPath>WEB-INF/lib</targetPath>
                <includes>
                        <include>mySystemJar1.jar.jar</include>
                         <include>mySystemJar2.jar</include>
                   </includes>
            </resource>
        </webResources>
    </configuration>
</plugin>

0

mvn install: install-file -DgroupId = com.paic.maven -DartifactId = tplconfig-maven-plugin -Dversion = 1.0 -Dpackaging = jar -Dfile = tplconfig-maven-plugin-1.0.jar -DgeneratePom = true

Instal jar ke repositori lokal.


3
Ini merepotkan daripada menambahkan melalui pom secara langsung.
Pradeeban Kathiravelu

0

Berkat Ging3r saya mendapat solusi:

ikuti langkah ini:

  1. jangan gunakan dalam tag ketergantungan. Gunakan tag berikut dalam dependensi di file pom.xml ::

    <dependency>
    <groupId>com.netsuite.suitetalk.proxy.v2019_1</groupId>
    <artifactId>suitetalk-axis-proxy-v2019_1</artifactId>
    <version>1.0.0</version>
    </dependency>
    <dependency>
        <groupId>com.netsuite.suitetalk.client.v2019_1</groupId>
        <artifactId>suitetalk-client-v2019_1</artifactId>
        <version>2.0.0</version>
    </dependency>
    <dependency>
        <groupId>com.netsuite.suitetalk.client.common</groupId>
        <artifactId>suitetalk-client-common</artifactId>
        <version>1.0.0</version>
    </dependency>
    
  2. gunakan kode berikut di tag plugin di file pom.xml:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
            <version>2.5.2</version>
            <executions>
                <execution>
                    <id>suitetalk-proxy</id>
                    <phase>clean</phase>
                    <configuration>
                        <file>${basedir}/lib/suitetalk-axis-proxy-v2019_1-1.0.0.jar</file>
                        <repositoryLayout>default</repositoryLayout>
                        <groupId>com.netsuite.suitetalk.proxy.v2019_1</groupId>
                        <artifactId>suitetalk-axis-proxy-v2019_1</artifactId>
                        <version>1.0.0</version>
                        <packaging>jar</packaging>
                        <generatePom>true</generatePom>
                    </configuration>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                </execution>
                <execution>
                    <id>suitetalk-client</id>
                    <phase>clean</phase>
                    <configuration>
                        <file>${basedir}/lib/suitetalk-client-v2019_1-2.0.0.jar</file>
                        <repositoryLayout>default</repositoryLayout>
                        <groupId>com.netsuite.suitetalk.client.v2019_1</groupId>
                        <artifactId>suitetalk-client-v2019_1</artifactId>
                        <version>2.0.0</version>
                        <packaging>jar</packaging>
                        <generatePom>true</generatePom>
                    </configuration>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                </execution>
                <execution>
                    <id>suitetalk-client-common</id>
                    <phase>clean</phase>
                    <configuration>
                        <file>${basedir}/lib/suitetalk-client-common-1.0.0.jar</file>
                        <repositoryLayout>default</repositoryLayout>
                        <groupId>com.netsuite.suitetalk.client.common</groupId>
                        <artifactId>suitetalk-client-common</artifactId>
                        <version>1.0.0</version>
                        <packaging>jar</packaging>
                        <generatePom>true</generatePom>
                    </configuration>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    

Saya termasuk 3 botol dari folder lib:

termasuk jar eksternal dalam proyek boot musim semi

Terakhir, gunakan mvn cleandan kemudian mvn installatau 'mvn clean install' dan jalankan file jar dari folder target atau jalur di mana install (lihat mvn installlog):

java -jar abc.jar

Catatan: Ingat satu hal jika Anda bekerja di jenkins kemudian gunakan pertama mvn cleandan kemudian mvn clean installperintah bekerja untuk Anda karena dengan kode sebelumnya mvn clean installmenyimpan cache untuk ketergantungan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.