4

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

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

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

任何提示或想法如何解决这个问题?

谢谢,彼得

4

2 回答 2

1

简短的回答是:没有理智的方法可以做到这一点,Maven 不能那样工作。

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

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

不幸的是,在项目尚不可用的时候,变量被扩展了。


因此,唯一好的解决方案是以编程方式进行。编写自定义插件或使用GMaven创建一个 groovy 脚本。尝试从存储库中解析项目工件,如果成功则抛出 MojoFailureException。但它仍然是hacky,我会离开它。

于 2011-09-07T12:14:23.870 回答
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 版本中。

因此,正如肖恩·帕特里克·弗洛伊德(Sean Patrick Floyd)已经提到的那样,没有“内置”方法可以做到这一点

于 2011-09-07T14:26:56.420 回答