Есть ли способ установить зависимости maven до того, как maven попытается их разрешить?

Мне нужно распаковать некоторые зависимости из удаленного места и установить их локально.

Я успешно их получаю (используя плагин antrun) и устанавливаю их (используя плагин установки)

Однако, если я определяю их как зависимости (<dependency>..</dependency>), maven сначала пытается их разрешить, и только тогда, если это удастся, переходит к antrun и устанавливает.

Я также попробовал build-helper-plugin и его артефакт прикрепления, но он ничего не делает (он даже не добавляет артефакты к окончательному файлу войны)

Итак, как запустить мои казни, прежде чем maven попытается разрешить зависимости?

Ответ 1

Интересный вопрос! Одна из попыток (возможно) достичь этой цели - использовать настройку Multi Module Project.

Извлеките и установите зависимости в родительском проекте и используйте их в дочернем модуле. Я протестировал свое предположение следующим образом:

Родительский pom.xml

<project
    xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>foo.bar</groupId>
    <artifactId>foo.bar.parent</artifactId>
    <version>1.0.0</version>
    <packaging>pom</packaging>

    <modules>
        <module>foo.bar.child</module>
    </modules>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-antrun-plugin</artifactId>
                <version>1.6</version>
                <executions>
                    <execution>
                        <phase>validate</phase>
                        <configuration>
                            <target>
                                <echo
                                    message="Hello world!" />
                            </target>
                        </configuration>
                        <goals>
                            <goal>run</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

Модуль pom.xml

<project
    xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>foo.bar</groupId>
    <artifactId>foo.bar.child</artifactId>
    <version>1.0.0</version>

    <parent>
        <groupId>foo.bar</groupId>
        <artifactId>foo.bar.parent</artifactId>
        <version>1.0.0</version>
    </parent>

    <dependencies>
        <dependency>
            <artifactId>can.not</artifactId>
            <groupId>find.me</groupId>
            <version>0.0.0</version>
        </dependency>
    </dependencies>

</project>

Я получаю вывод "Hello World" из родительской сборки pom до того, как завершится создание дочернего модуля (из-за отсутствия зависимости). Если вы хотите, чтобы обеспечить зависимость в родительском пакете, проект дочернего модуля должен быть доступен для сборки.

Ответ 2

вам следует посмотреть, как запустить Architeact Repository Manager, например Archiva, тогда вы можете просто загрузить их там, а в вашем файле ~/.m2/settings.xml добавить сервер Archiva и не беспокоиться о локальных установках вручную, то есть предполагая, что артефакты еще не находятся в удаленном репозитории. Если ваше "удаленное местоположение" является репозиторием Maven, Archiva может также прокси-серверу прозрачно.

Ответ 3

Я закончил это в два этапа:

  • настроить antrun и выполнить выполнение для clean
  • когда выбрано package, сборка завершится неудачно, если она не была очищена по крайней мере один раз

Решение представляет собой небольшую сложность.

Ответ 4

Вы можете попробовать область system в зависимости и добавить systemPath:

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.0</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/myhackedjunit-4.0.jar</systemPath>
</dependency>

Область system похожа на provided, за исключением того, что вы должны предоставить JAR, который содержит это явно. Артефакт всегда доступен и не просматривается в репозитории.

systemPath используется только в том случае, если область зависимостей является системой. Путь должен быть абсолютным. Поскольку предполагается, что зависимостей системной области установлены ранее, Maven не будет проверять репозитории для проекта, но вместо этого проверяет, существует ли файл.