Maven 2:如果尚未在本地存储库中安装,则仅构建工件

时间:2011-09-07 12:07:15

标签: maven build repository skip artifact

如何在Maven中实现从命令行执行“mvn install”时,只有在本地存储库中尚未安装该工件时才会自动决定构建工件(jar / war)?

我已经尝试过配置文件,这里的问题是在“激活”任务中我无法通过Maven属性引用我的本地存储库。我不能硬编码本地存储库,因为这会破坏我在不同环境中的构建。

我还尝试通过触摸前一阶段的文件来解决此问题,例如:初始化然后检查文件是否存在为激活条件,但这不起作用,因为在执行初始化之前评估了激活条件。

如何解决此问题的任何提示或想法?

谢谢, 彼得

2 个答案:

答案 0 :(得分:1)

简短的回答是:没有理智的方法,Maven不会这样做。

您可以做的是创建一个shell脚本,尝试首先从本地仓库解析项目(使用dependency:get)并仅在第一部分失败时调用mvn clean install。但问题是你必须在调用中使用项目的确切groupId,artifactId和版本,因为这不起作用:

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

不幸的是,当项目尚未可用时,变量会被扩展。


所以唯一好的解决方案是以编程方式进行。编写自定义插件或使用GMaven创建一个groovy脚本。尝试resolve the project artifact from the repository并在成功时抛出MojoFailureException。但它仍然是hacky,我只是离开它。

答案 1 :(得分:0)

如果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版本中。

所以,正如肖恩·帕特里克·弗洛伊德已经提到的那样没有“内置”方式来做到这一点