Maven依赖于覆盖资源文件

时间:2011-11-10 20:40:22

标签: maven resources overwrite

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

2 个答案:

答案 0 :(得分:6)

好的,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>

所以,在<configuration> ... </configuration> -tags中我定义了两件事:一个转换器实现,负责修改jar-manifest可运行,并使用当前目录作为classpath root,并排除所有从依赖org.something内部以.properties结尾的文件:SomeDependency。

实际的过滤部分是您可以排除您不想在由阴影构建的最终jar中最终的文件。您可以使用<artifact>*:*</artifact>中的<filter>排除所有依赖项和当前项目中的文件,也可以使用<artifact>dependcyGroupId:dependencyArtifact</artifact>仅选择某个依赖项,例如<artifact>junit:junit</artifact>,甚至使用通配符表示其中一个(<artifact>*:junit</artifact>)。然后在<excludes>...</excludes> -tags内定义排除的文件。同样,您可以使用确切的文件名或通配符。这应该可以帮助您解决当前的问题,尽管我建议您从插件站点阅读文档,因为阴影可以比这更多。

答案 1 :(得分:6)

我知道这已经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>

关键是为依赖项和实际项目(层次结构顶部)提供不同的规则。可以使用<useProjectArtifact>false</useProjectArtifact>拆分这些内容,并在fileSets中为项目提供单独的规则。否则,log4j.properties都不会被打包,包括最上面的一个。