Maven та додавання JAR до сфери застосування системи


86

У моєму Android-проекті є JAR, і я хочу, щоб його додали до остаточного файлу .apk. Гаразд, ось я йду:

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

Але коли я біжу, mvn packageя отримую попередження:

[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

І в остаточному файлі .apk немає JAR-файлів.

Як це виправити?


3
Ви не можете використовувати системний обсяг таким чином. використовуйте install: install-file.
bmargulies

@bmargulies Чи можете ви сказати, для чого ця сфера?
efpies

1
Я перейшов на gradle і більше не болю в голові, за винятком того, що зараз я намагаюся використовувати бібліотеку з відкритим кодом з maven і тимчасово зламати банку (що це так просто в gradle і так важко в maven).
Дін Хіллер

1
Це питання обговорює, як уникнути використання системної області в Maven: stackoverflow.com/questions/3642023/…
Марк Батлер

Офіційна документація про сферу дії "система": maven.apache.org/guides/introduction/…
Гійом Хуста,

Відповіді:


24

Вам потрібно буде додати банку до місцевого сховища maven. В якості альтернативи (кращий варіант) вкажіть правильний репозиторій (якщо такий існує), щоб його можна було автоматично завантажити maven

У будь-якому випадку видаліть <systemPath>тег із залежності


4
Я бачив цю статтю, але сподівався не maven installна всіх комп'ютерах, де хочу побудувати цей проект (на жаль, я не знайшов цього JAR у репозиторіях). Дякую! :)
efpies

1
Він може бути написаний як сценарій складання.
Торбьорн Равн Андерсен

143

Я не знаю справжньої причини, але Maven штовхає розробників на встановлення всіх бібліотек (також на замовлення) у деякі сховища maven, тому scope:systemце не дуже сподобалося. Просте обхідне рішення - використовуватиmaven-install-plugin

дотримуйтесь використання:

напишіть свою залежність таким чином

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

потім додайте 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>

зверніть увагу phase:clean, щоб встановити власну бібліотеку у ваш репозиторій, вам потрібно запустити mvn cleanі потімmvn install


10
Чому б не використовувати <phase>process-resources</phase>замість <phase>clean</phase>. Фаза процес-ресурси виглядає більш доречною для такого сценарію, і вона завжди викликається перед фазою компіляції.
jplandrain

1
при першій установці ви впевнені, що можете пройти фазу "перевірки", яка настає перед процесними ресурсами в "побудованому життєвому циклі"? ; ), "чистий життєвий цикл" стоїть на першому місці "побудований життєвий цикл", і він не залежить від будь-якої перевірки, tutorialspoint.com/maven/maven_build_life_cycle.htm
Ging3r

5
Це працює, але як встановити кілька залежностей?
Renaud Pawlak

6
Stackoverflow повинен додати функцію, яка дозволяє спільноті замінити вибір правильної відповіді OP, оскільки IMHO, Ця відповідь повинна бути прийнятою! :)
Віджай Чавда,

2
Як коментували інші, прив'язка до cleanфази дуже вводить в оману, вона не є частиною життєвого циклу за замовчуванням і спотворює значення clean. Крім того, запропоновані зміни використовувати фазу життєвого циклу за замовчуванням (наприклад , validateчи process-resources) зазнає невдачі в ситуації з декількома модуля, так як дозвіл залежностей зроблено агрегатор, до будь-яких призначених для користувача завдань , які виконують для дочірніх модулів.
шерсть.в сріблі

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

Спробуйте це.


11

Область застосування системи була розроблена лише для роботи з "системними" файлами; файли, що сидять у певному місці. Файли в /usr/lib, або ${java.home}(наприклад tools.jar). Він не був розроблений для підтримки різного.jar файлів у вашому проекті.

Автори навмисно відмовились зробити так, щоб розширення доріжок працювали правильно, щоб це вас відбило. Як результат, у короткостроковій перспективі ви можете використовувати install:install-fileдля встановлення в локальне репо, а потім одного дня за допомогою менеджера репо можна поділитися.


3

Скористайтеся диспетчером сховищ і встановіть у нього подібні банки. Це вирішує ваші проблеми взагалі та для всіх комп’ютерів у вашій мережі.


3
Ми планували запустити репо на локальному сервері завтра або післязавтра, але до цього я мав би вирішити цю проблему іншим способом.
efpies

1
Як згадував @efpies, це може бути простою відповіддю, коли розробник не має дозволів / можливості створювати менеджер репо.
javadba

У наші дні, якщо у вас встановлений Docker, все, що вам потрібно docker run -d -p 8081:8081 --name nexus sonatype/nexus3- див. Hub.docker.com/r/sonatype/nexus3 для отримання детальної інформації.
Thorbjørn Ravn Andersen

3

Спробуйте цю конфігурацію. Мені це вдалося:

<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

Встановіть банку в локальне сховище.


3
Це громіздко, ніж додавання через помпу безпосередньо.
Pradeeban Kathiravelu

0

Завдяки Ging3r я отримав рішення:

виконайте такі дії:

  1. не використовувати в тегу залежності. Використовуйте наступне у тегу залежностей у файлі 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. використовуйте наступний код у тегу плагінів у файлі 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>
    

Я включаю 3 банки з папки lib:

включаючи зовнішній jar у проекті весняного завантаження

Нарешті, використовуйте, mvn cleanа потім mvn installабо 'mvn clean install' і просто запустіть файл jar з цільової папки або шляху, де встановлюється (див. mvn installЖурнал):

java -jar abc.jar

Примітка: Запам’ятайте одне, якщо ви працюєте на jenkins, то спочатку використовуйте, mvn cleanа потім mvn clean installпрацюйте команду, тому що з попереднім кодом mvn clean installкеш зберігає кеш для залежностей.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.