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?

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

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

Ging3r
sumber
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.

pengguna9064925
sumber
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.

bmargulies
sumber
3

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

khmarbaise
sumber
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>
sofiene zaghdoudi
sumber
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.

anggun
sumber
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.

ankit
sumber