如何在Maven中实现从命令行执行“mvn install”时,只有在本地存储库中尚未安装该工件时才会自动决定构建工件(jar / war)?
我已经尝试过配置文件,这里的问题是在“激活”任务中我无法通过Maven属性引用我的本地存储库。我不能硬编码本地存储库,因为这会破坏我在不同环境中的构建。
我还尝试通过触摸前一阶段的文件来解决此问题,例如:初始化然后检查文件是否存在为激活条件,但这不起作用,因为在执行初始化之前评估了激活条件。
如何解决此问题的任何提示或想法?
谢谢, 彼得
答案 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版本中。
所以,正如肖恩·帕特里克·弗洛伊德已经提到的那样没有“内置”方式来做到这一点。