Maven Assembly插件和资源

时间:2010-12-22 21:13:48

标签: maven log4j maven-assembly-plugin

当使用Maven程序集插件(版本2.2-beta-5)时,如果它们具有相同的路径,则看起来组装的jar将包含来自依赖项的资源,而不是正在组装的项目。具体来说,我试图弄清楚如何使用项目的log4j配置文件而不是依赖项目。

PROJECT1

-src

- 主

---资源

----的log4j.xml

如果Project1有一个依赖项 - 称之为Project2 - 在src / main / resources中也有一个log4j.xml文件,那么在运行程序集插件后,组装的jar包含Project2的log4j.xml文件而不是Project1。我相信这是因为所有的依赖项首先被解压缩,因此当它尝试解压缩顶层项目时,log4j.xml文件已经存在,因此它不会被覆盖。

组件插件是否使用项目的文件而不是依赖项?

2 个答案:

答案 0 :(得分:3)

这样的事情应该有效:

<assembly>
    <id>without-log4j-config</id>
    <formats>
        <format>jar</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <dependencySets>
        <dependencySet>
            <unpack>true</unpack>
            <scope>runtime</scope>
            <unpackOptions>
                <excludes>
                    <exclude>**/log4j.xml</exclude>
                    <exclude>**/log4j.properties</exclude>
                </excludes>
            </unpackOptions>
        </dependencySet>
    </dependencySets>
    <files>
        <file>
            <source>pom.xml</source>
            <outputDirectory>/</outputDirectory>
        </file>
    </files>
    <fileSets>
        <fileSet>
            <useDefaultExcludes>false</useDefaultExcludes>
            <outputDirectory>/</outputDirectory>
        </fileSet>
        <fileSet>
            <directory>src/main/java</directory>
            <outputDirectory>/</outputDirectory>
        </fileSet>
        <fileSet>
            <directory>src/main/resources</directory>
            <outputDirectory>/</outputDirectory>
        </fileSet>
    </fileSets>
    <moduleSets>
        <moduleSet>
            <includeSubModules>false</includeSubModules>
            <sources>
                <outputDirectoryMapping>/</outputDirectoryMapping>
                <excludeSubModuleDirectories>false</excludeSubModuleDirectories>
                <fileSets>
                    <fileSet>
                        <directory>src/main/java</directory>
                        <outputDirectory>/</outputDirectory>
                    </fileSet>
                    <fileSet>
                        <directory>src/main/resources</directory>
                        <outputDirectory>/</outputDirectory>
                    </fileSet>
                </fileSets>
            </sources>
            <binaries>
                <dependencySets>
                    <dependencySet>
                        <unpack>true</unpack>
                    </dependencySet>
                </dependencySets>
            </binaries>
        </moduleSet>
    </moduleSets>
</assembly>

你需要在你的pom中使用它:

        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <appendAssemblyId>true</appendAssemblyId>
                <descriptors>
                    <descriptor>src/main/resources/whatever-you-name-the-snippet-above.xml</descriptor>
                </descriptors>
            </configuration>
        </plugin>

这是一个重要的部分:

<appendAssemblyId>true</appendAssemblyId>

如果没有它,如果你运行mvn assembly:assembly,你的自定义程序集将被覆盖。

答案 1 :(得分:1)

一种可能性是从程序集创建中明确排除相关文件。

    <dependencySet>
        <outputDirectory>/</outputDirectory>
        <includes>
            <include>${project.groupId}:Project2</include>
        </includes>
        <unpack>true</unpack>
        <unpackOptions>
            <excludes>
                <exclude>**/log4j.xml</exclude>
            </excludes>
        </unpackOptions>
    </dependencySet>