首页 > 解决方案 > 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>

设想:

我们正在情况 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

预期成绩

问题

我需要添加哪些魔法咒语,pom.xml以便在任何情况下都不会覆盖现有文件?

参考的文档

标签: maven

解决方案


好的,我想我知道可能会发生什么:就像我在评论中所说:

我刚刚在邮件列表中阅读了您的消息,并尝试了我自己的一个项目,也使用插件版本 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 最初不存在时它才会激活。


推荐阅读