使用 maven 程序集插件覆盖资源文件

Posted

技术标签:

【中文标题】使用 maven 程序集插件覆盖资源文件【英文标题】:Overwrite resource file with maven assembly plugin 【发布时间】:2011-08-27 00:25:55 【问题描述】:

我使用带有“jar-with-dependencies”的 maven-assembly-plugin 来打包 jar。有 2 个具有 log-back.xml 的依赖项工件。第二个工件取决于第一个工件。我想在最终的 jar 中包含第二个工件的 log-back.xml,但它总是包含第一个工件的 log-back.xml。那我该如何控制呢?

谢谢

【问题讨论】:

这里是一个特定情况的答案***.com/a/24578209/1531945 通常,操纵dependencySetsunpackOptions 应该可以解决问题。 【参考方案1】:

第一个工件是您自己项目的模块吗?如果是这样,您可以在 pom.xml 的资源部分中排除 log-back.xml。

<resources>
  <resource>
    <directory>src/main/resources</directory>
    <excludes>
      <exclude>log-back.xml</exclude>
    </excludes>
  </resource>
  ...
</resources>

但是,只有当这个模块在整个 jar 的范围之外构建时,它本身不需要 log-back.xml,这才有效。

【讨论】:

很遗憾,我无法更改第一个工件。 哦,好吧,那我想这会很困难。据我所知,您只能排除依赖项的传递依赖项,但不能排除捆绑在依赖项中的内容。【参考方案2】:

您可以使用unpackOptions 来实现此目的。尝试以下方法:

<assembly>
...
    <dependencySets>
        <dependencySet>
            <outputDirectory>/</outputDirectory>
            <includes>
                <include>$groupId:$artifact.whose.logback.is.to.be.excluded </include>
            </includes>
            <unpack>true</unpack>
            <unpackOptions>
                <excludes>
                    <exclude>**/logback.xml</exclude>
                </excludes>
            </unpackOptions>
        </dependencySet>
        <dependencySet>
            <outputDirectory>/</outputDirectory>
            <excludes>
                <exclude>$groupId:$artifact.whose.logback.is.to.be.excluded</exclude>
            </excludes>
            <unpack>true</unpack>
        </dependencySet>
    </dependencySets>
</assembly>

【讨论】:

我明白了你的想法,但它不起作用。 logback.xml 不包含在最终 jar 中。也许,插件扩展了 jars,然后用过滤器将它们打包(排除 logback.xml) 这仅适用于我编辑 assembly.xml 后的第一次构建。如果我再次运行构建,它将停止工作。似乎资源被复制的顺序是不确定的,因此不能保证这会起作用。【参考方案3】:

(此时使用 maven-assembly-plugin 的最新版本:3.0.0)

我在构建程序集时遇到了同样的问题。

我有两个具有相同属性文件但内容不同的依赖项(一个很好,另一个用缺少的声明覆盖了第一个)。

问题是我终于用错误的配置文件替换了我的程序集 jar 中的另一个。

我发现覆盖文件的唯一最干净的解决方案是:

1 - 在我的项目中添加我想为构建保留的好文件: 例如:src/main/resources/META-INF/services/myfileWhichOverwriteTheBadDependenciesRessources.xml

2 - 在我的程序集描述符中添加一个“过滤”设置为“真”的文件集:

    <fileSet>
        <directory>$project.main.resources/META-INF</directory>
        <outputDirectory>META-INF</outputDirectory>
        <filtered>true</filtered>
    </fileSet>

(在我的例子中,“project.main.resource”属性设置为“src/main/resources”)

【讨论】:

您可以在答案中使用反引号`将事物标记为code,例如文件名会更易读。

以上是关于使用 maven 程序集插件覆盖资源文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring Boot Maven 插件时,jar 文件中缺少 Spring Boot 应用程序中的资源

将属性文件与 Maven 程序集合并

使用Maven程序集插件创建WAR文件

MAVEN插件-tomcat插件,java编译插件,资源文件拷贝插件

Maven 阴影插件重定位不更新资源文件中的条目

如何使用 maven 程序集插件在 tar 中创建和包含 zip 文件