maven - maven-dependency-plugin 解包目标:不要覆盖现有文件
问题描述
在任何情况下,我都不想maven-dependency-plugin:3.1.2:unpack
覆盖现有文件。这是我目前的pom.xml
配置:
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.2</version>
<executions>
<execution>
<id>unpack-zip-files</id>
<phase>generate-test-resources</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>com.foo</groupId>
<artifactId>bar</artifactId>
<version>${foobar.version}</version>
<type>zip</type>
<classifier>exe-archive</classifier>
<overWrite>false</overWrite>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<includes>**/*.exe</includes>
</artifactItem>
</artifactItems>
<overWriteIfNewer>false</overWriteIfNewer>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
</configuration>
</execution>
</executions>
</plugin>
设想:
- 项目
foo
和bar
foo
有一个.exe
文件作为构建工件,在一个 ZIP 文件中bar
在测试期间运行.exe
文件- 在情况 X 中,
bar
必须使用foo
. 在这种情况下,目录target/lib
之前应该是空的mvn install
。这可以通过从空工作区开始并mvn clean
作为单独的构建步骤运行来保证。这个问题与情况 X 无关。 - 在情况 Y 中,
bar
必须使用foo
. 这是通过在和之间的单独构建步骤中将带有 的 ZIP 文件解压缩.exe
到目录来完成的。target/lib
mvn clean
mvn install
我们正在情况 Y 中工作,其中target/lib
目录已经预先填充了.exe
来自正确功能分支的 。
这是运行之前target/lib
的目录: mvn
+ ls -al fooBar.exe
-rw-rw-r-- 1 ubuntu ubuntu 18368427 Apr 12 21:27 fooBar.exe
+ md5sum fooBar.exe
03acc8b5c3da700c31efcd6635feb56a fooBar.exe
这是运行后target/lib
的目录: mvn
+ ls -al fooBar.exe
-rwxrwxr-x 1 ubuntu ubuntu 18368393 Apr 11 23:10 fooBar.exe
+ md5sum fooBar.exe
ab6dd45c5cc4e41534ad2363c5767601 fooBar.exe
变化是现有被 Maven 覆盖的md5sum
确凿证据。fooBar.exe
使用的 Maven 命令:
mvn --global-settings /home/jenkins/workspace/bar@tmp/config15592668079584895681tmp \
-Dmaven.repo.local=/home/jenkins/workspace/bar/.repository \
install \
-DgsExec=/usr/bin/gs -DcompareExec=/usr/local/bin/compare \
-Dtest=RunCucumberTest -Dcucumber.options=--plugin json:target/cucumber.json
预期成绩
- 当, , ,全部设置为时,该
mvn install
命令不应覆盖现有文件。overWrite
overWriteIfNewer
overWriteReleases
overWriteSnapshots
false
- 运行前后的
md5sum
应相同。fooBar.exe
mvn install
问题
我需要添加哪些魔法咒语,pom.xml
以便在任何情况下都不会覆盖现有文件?
参考的文档
解决方案
好的,我想我知道可能会发生什么:就像我在评论中所说:
我刚刚在邮件列表中阅读了您的消息,并尝试了我自己的一个项目,也使用插件版本 3.1.2。实际上,只需
<overWrite>false</overWrite>
在内部指定<artifactItem>
就足以避免覆盖。我只是执行了一次解压目标,然后手动修改了一个解压文件并且它没有被覆盖。我什my-artifact-1.3.jar already unpacked
至在日志中看到。
我继续进行更多试验,发现即使删除了许多解压文件,它们也不会被重新创建,因此检查必须在更全局的级别上进行,而不是在每个文件的基础上进行。
即使删除所有文件或整个输出目录,也不会再次解包依赖项。这是一个明确的指标,某种元信息必须存储在输出目录之外的某个地方。首先要查找它的地方当然是target
目录,而且很明显,在子目录target/dependency-maven-plugin-markers
中有(空)标记文件,例如my-dependency-1.3.marker
. 删除其中一个文件会导致在下一次构建期间再次解压缩依赖项,从而覆盖可能存在的文件。
所以你解决这个问题的方法是避免清理target
目录或至少确保保留相应的标记文件。
更新:如果您要保护的 EXE 文件存在并且由于某种原因您的构建工作流程需要clean
介于两者之间,您也可以自己创建标记文件。但后者会有点难看,你应该尽量避免它。不过,使用 Antrun 或一些 Beanshell 或 Groovy 脚本,这将是可能的。
如果 EXE 文件不存在,则自动激活的配置文件会更优雅一些,然后将依赖项插件放在配置文件中,即只有当 EXE 最初不存在时它才会激活。
推荐阅读
- list - 德尔这里的问题。这是重复的
- python - Python 和 Bash 以不同方式处理十六进制(shellcode)?不一致?
- java - 是否可以像在 Android Studio 中一样在 Eclipse 中使用 Firebase?
- vuejs2 - Vuejs动态引用未定义
- python - python递归函数和全局变量错误
- r - is.element() 和 %in% 没有返回正确的值
- python - Python 中的 Fama-Macbeth
- r - 根据另一个数据框中的单元格引用删除一个数据框中的值
- python - 如何使用张量流将共现先验知识添加到 nn 的损失函数中
- c++ - 使用模板模板参数时出错