Maven 2: артефакт сборки, только если он еще не установлен в локальном хранилище - PullRequest
4 голосов
/ 07 сентября 2011

Как можно добиться в Maven того, что при выполнении "mvn install" из командной строки автоматически будет решено создать артефакт (jar / war), только если этот артефакт еще не установлен в локальном хранилище?

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

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

Любые советы или идеи, как решить эту проблему?

Спасибо, Питер

Ответы [ 2 ]

1 голос
/ 07 сентября 2011

Краткий ответ: нет нормального способа сделать это, Maven так не работает.

Что вы можете сделать, это создать сценарий оболочки, который сначала пытается разрешить проект из локального репозитория(используйте dependency:get) и вызывает mvn clean install только в случае сбоя первой части.Но проблема в том, что вам нужно будет использовать точные значения groupId проекта, artifactId и версию в вызове, поскольку это не будет работать:

mvn dependency:get -DrepoUrl=${localRepository} -DgroupId=${project.groupId} \
    -DartifactId=${project.artifactId} -Dversion=${project.version} \
    -Dtransitive=false

К сожалению, переменные раскрываются в то времяпроект еще не доступен.


Таким образом, единственным хорошим решением будет сделать это программно.Либо напишите собственный плагин, либо создайте отличный скрипт, используя GMaven .Попробуйте разрешить артефакт проекта из репозитория и в случае успеха выдать исключение MojoFailureException.Но он все еще хакерский, и я бы просто оставил его.

0 голосов
/ 07 сентября 2011

Если у maven-install-plugin будет , пропустить конфигурацию, это должно быть возможно с каким-то профилем (возможно, вам придется изменить системное свойство, чтобы получить домашний каталог с репозиторием m2) :

<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>lorem-ipsum</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <properties>
        <skip.install>false</skip.install>
    </properties>

    <profiles>
        <profile>
            <id>already-installed</id>
            <activation>
                <file>
                    <exists>${env.USERPROFILE}/.m2/repository/foo/bar/${project.artifactId}/${project.version}/${project.artifactId}-${project.version}.${project.packaging}</exists>
                </file>
            </activation>
            <properties>
                <skip.install>true</skip.install>
            </properties>
        </profile>
    </profiles>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-install-plugin</artifactId>
                <version>2.3.1</version>
                <configuration>
                    <skip>${skip.install}</skip>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

К сожалению, у maven-install-plugin нет возможности пропустить конфигурацию. По этому поводу есть запрос на улучшение MINSTALL-73 . Возможно, вам следует поднять этот запрос, чтобы включить исправление в будущий выпуск Maven.

Итак, как уже упоминал Шон Патрик Флойд , «встроенного» способа сделать это не существует .

...