Maven и добавление JAR в системную область

86

У меня есть JAR в моем Android-проекте, и я хочу, чтобы он был добавлен в окончательный 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.

Как мне это исправить?

efpies
источник
3
Таким образом нельзя использовать системную область видимости. используйте install: install-file.
bmargulies 07
@bmargulies Можете сказать, для чего нужен этот прицел?
efpies 07
1
Я переключился на gradle, и у меня больше нет этих головных болей, за исключением того, что теперь я пытаюсь использовать библиотеку с открытым исходным кодом с maven и временно взломать банку (это так просто в gradle и так сложно в maven).
Дин Хиллер
1
В этом вопросе обсуждается, как избежать использования системной области в Maven: stackoverflow.com/questions/3642023/…
Марк Батлер,
Официальная документация о «системе» областей видимости
Гийом Хуста,

Ответы:

24

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

В любом случае удалите <systemPath>тег из зависимости

Аттила
источник
4
Я видел эту статью, но надеялся не делать этого maven installна каждом компьютере, на котором я хочу собрать этот проект (к сожалению, я не нашел этот JAR в репозиториях). Благодарность! :)
efpies 07
1
Он может быть написан как часть сборки.
Thorbjørn Ravn Andersen
145

Я не знаю настоящей причины, но 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

Ging3r
источник
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) не удастся в ситуации с несколькими модулями, поскольку агрегатор пытается разрешить зависимости до выполнения каких-либо настраиваемых целей для дочерних модулей.
шерсть.in.silver 01
14
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <includeSystemScope>true</includeSystemScope>
    </configuration>
</plugin>

Попробуй это.

user9064925
источник
11

Системная область была разработана только для работы с «системными» файлами; файлы, находящиеся в фиксированном месте. Файлы в /usr/lib, или ${java.home}(например tools.jar). Он не предназначен для поддержки различных .jarфайлов в вашем проекте.

Авторы намеренно отказались заставить расширения имен файлов работать правильно, чтобы это вас обескуражило. В результате в краткосрочной перспективе вы можете использовать install:install-fileдля установки в локальное репо, а затем когда-нибудь использовать менеджер репо для совместного использования.

bmargulies
источник
3

Используйте менеджер репозитория и установите в него такие jar-файлы. Это решает ваши проблемы вообще и для всех компьютеров в вашей сети.

хмарбайсе
источник
3
Мы планировали запустить репо на локальном сервере завтра или послезавтра, но перед этим я должен решить эту проблему другим способом.
efpies 07
1
Как упоминалось в @efpies, это может быть простой ответ, когда у разработчика нет разрешений / возможности создать диспетчер репо.
StephenBoesch
В наши дни, если у вас установлен докер, все, что вам нужно, - подробности 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:

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

Наконец, используйте mvn cleanand then mvn installили mvn clean install и просто запустите файл jar из целевой папки или пути, по которому устанавливается (см. mvn installЖурнал):

java -jar abc.jar

Примечание: помните одну вещь, если вы работаете с jenkins, тогда сначала используйте, mvn cleanа затем mvn clean installкоманду, работающую за вас, потому что с предыдущим кодом mvn clean installкоманда сохраняет кеш для зависимости.

анкит
источник