Сборка Maven: добавить разные версии одного и того же артефакта - PullRequest
18 голосов
/ 30 ноября 2010

Я создаю архив приложений с помощью подключаемого модуля maven. Все зависимости, присутствующие в моем поме, включены без каких-либо проблем.

Теперь мне нужно включить две или более версии одного и того же артефакта.

Если в моем поме я положу

<dependencies>
        [...]
        <dependency>
            <groupId>db.test</groupId>
            <artifactId>my-model</artifactId>
            <version>1.0.3</version>
        </dependency>
        <dependency>
            <groupId>db.test</groupId>
            <artifactId>my-model</artifactId>
            <version>1.1.0</version>
        </dependency>
</dependencies>

Из источника средство разрешения зависимостей удаляет старую версию, и только архив 1.1.0 упакован в архив

Я пытаюсь включить jar, используя файл дескриптора сборки xml. И я не нашел никакого решения.

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

Есть идеи?

Ответы [ 4 ]

13 голосов
/ 30 ноября 2010

Я нашел решение, используя maven-dependency-plugin для копирования разрешенных зависимостей pom и дополнительного jar.

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.1</version>
<executions>
    <execution>
        <id>copy-dependencies</id>
        <phase>package</phase>
        <goals>
            <goal>copy-dependencies</goal>
        </goals>
        <configuration>
            <outputDirectory>${project.build.directory}/lib</outputDirectory>
            <overWriteReleases>false</overWriteReleases>
            <overWriteSnapshots>false</overWriteSnapshots>
            <overWriteIfNewer>true</overWriteIfNewer>
            <includeScope>runtime</includeScope>
        </configuration>
    </execution>
    <execution>
        <id>copy-model</id>
        <phase>package</phase>
        <goals>
            <goal>copy</goal>
        </goals>
        <configuration>
            <artifactItems>
                <artifactItem>
                    <groupId>my.test.pkg</groupId>
                    <artifactId>my-model</artifactId>
                    <classifier>server</classifier>
                    <version>1.0.3</version>
                    <type>jar</type>
                </artifactItem>
                <artifactItem>
                    <groupId>my.test.pkg</groupId>
                    <artifactId>my-model</artifactId>
                    <classifier>server</classifier>
                    <version>1.1.0</version>
                    <type>jar</type>
                </artifactItem>
            </artifactItems>
            <outputDirectory>${project.build.directory}/lib</outputDirectory>
        </configuration>
    </execution>
</executions>

Теперь мне просто нужно добавить следующие строки в мою сборкуxml

    <fileSet>
        <directory>${project.build.directory}/lib</directory>
        <outputDirectory>/lib</outputDirectory>
        <filtered>false</filtered>
        <includes>
            <include>*.jar</include>
        </includes>
        <fileMode>0600</fileMode>
    </fileSet>
12 голосов
/ 30 ноября 2010

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

В общем, Maven пытался поощрять хороший дизайн приложения и намеренно мешал делать вещи, которые он определилбыть плохой идеей.

1 голос
/ 30 ноября 2010

Еще одним уродливым решением может быть наложение файлов WAR, используя тот факт, что этот механизм не обращает внимания на версии файлов JAR компонентов при применении наложений.

0 голосов
/ 10 февраля 2016

Согласен, разные версии означают замену старой.Если нам нужно использовать две разные версии веб-сервиса для каких-то бизнес-требований.Рекомендуется создавать заглушки в разных пакетах, и при добавлении в maven вы можете указать их в groupidЭто должно работать.

...