【问题标题】:Maven overwrite resource file in dependencyMaven覆盖依赖的资源文件
【发布时间】:2011-12-26 12:36:27
【问题描述】:

我有两个 Maven 模块,ABAB 的依赖项。这两个模块都有一个名为default.properties 的资源文件,位于src/main/resources。我需要在两个项目中保持相同的文件名和相同的文件位置,因为AB 都使用期望文件被命名并位于其所在位置的代码。在构建B 时,A 的默认属性在最终的jar 中。我希望在构建B 时拥有B 的属性。我该怎么做?

【问题讨论】:

    标签: maven resources overwrite


    【解决方案1】:

    好的,Maven Resources Plugin和Assembly插件没剪,所以我又挖了一些。

    看来Maven Shade plugin 可以做到这一点。

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>1.4</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <!-- Main class -->
                                    <mainClass> <!-- fully qualified package and class name --> </mainClass>
                                    <manifestEntries>
                                        <Class-Path>.</Class-Path>
                                    </manifestEntries>
                                </transformer>
                            </transformers>
    
                            <filters>
                                <filter>
                                    <artifact>org.something:SomeDependency</artifact>
                                    <excludes>
                                        <exclude>*.properties</exclude>
                                    </excludes>
                                </filter>
                            </filters>
    
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    

    所以,在&lt;configuration&gt; ... &lt;/configuration&gt; -tags 中,我定义了两件事:一个转换器实现,负责将 jar 清单修改为可运行并将当前目录用作类路径根目录,并排除所有结尾的文件来自依赖 org.something:SomeDependency 内部的 .properties。

    实际的过滤部分是您可以在其中排除您不希望最终出现在由 shade 构建的最终 jar 中的文件。您可以在定义的&lt;filter&gt; 中使用&lt;artifact&gt;*:*&lt;/artifact&gt; 从所有依赖项和当前项目中排除文件,或者您可以使用&lt;artifact&gt;dependcyGroupId:dependencyArtifact&lt;/artifact&gt; 仅选择某些依赖项,例如&lt;artifact&gt;junit:junit&lt;/artifact&gt;,甚至使用通配符作为一个或其他 (&lt;artifact&gt;*:junit&lt;/artifact&gt;)。然后在 &lt;excludes&gt;...&lt;/excludes&gt; -tags 中定义排除的文件。同样,您可以使用准确的文件名或通配符。这应该可以帮助您解决当前的问题,尽管我建议您从插件站点阅读文档,因为 shade 可以做的远不止这些。

    【讨论】:

    • 太好了,那么如何从依赖项中排除资源?您提供的链接仅适用于当前项目,不适用于依赖项。
    • 对不起,我想我读错了你的问题,我以为你的意思是从当前项目中排除。你有 A 的资源和 pom 可用吗?
    • 我检查了您提供的新链接;没有提供具体答案。我确实有 A 的资源和可用的 pom。
    • 第三次是魅力所在,我希望,我用几个虚拟项目尝试了 maven shade,并让它完全排除了我想要的东西。此外,如果 A 和 B 在同一路径中包含相同的文件并且没有配置排除项,则似乎阴影覆盖了依赖项中的一个与当前项目中的一个,但可以肯定的是,我建议使用配置的过滤器.
    • Shade 自己的此类问题示例:maven.apache.org/plugins/maven-shade-plugin/examples/…
    【解决方案2】:

    我知道这是 3 岁,但我遇到了同样的问题,这是我找到的最接近的问题,但仍然没有正确答案,所以也许有人会觉得它很有用。

    基于 jar-with-dependencies 的示例 maven-assembly 描述符(修复了依赖关系覆盖 log4j.properties):

    <assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
        <id>jar-with-dependencies</id>
        <formats>
            <format>jar</format>
        </formats>
        <includeBaseDirectory>false</includeBaseDirectory>
        <dependencySets>
            <dependencySet>
                <outputDirectory>/</outputDirectory>
                <useProjectArtifact>false</useProjectArtifact>
                <unpack>true</unpack>
                <unpackOptions>
                    <excludes>
                        <exclude>log4j.properties</exclude>
                    </excludes>
                </unpackOptions>
                <scope>runtime</scope>
            </dependencySet>
        </dependencySets>
        <fileSets>
            <fileSet>
                <directory>${project.build.outputDirectory}</directory>
                <outputDirectory>/</outputDirectory>
            </fileSet>
        </fileSets>
    </assembly>
    

    关键是为依赖项和实际项目(层次结构的顶部)提供不同的规则。这些可以通过使用&lt;useProjectArtifact&gt;false&lt;/useProjectArtifact&gt; 并在fileSets 中为项目提供单独的规则来拆分。否则,任何log4j.properties 都不会被打包,包括顶部的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-11
      • 2020-11-11
      • 2018-12-10
      • 1970-01-01
      • 2011-08-27
      • 1970-01-01
      • 2018-02-25
      • 2013-05-07
      相关资源
      最近更新 更多