如何通过将资源移出战争来打包Maven中的程序集?

时间:2013-11-26 21:09:37

标签: maven war maven-assembly-plugin maven-war-plugin

我们的项目设置为打包WAR,这对本地开发非常有用:

<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.3</version>
    <executions>
        <execution>
            <id>package-war</id>
            <phase>package</phase>
            <goals>
                <goal>war</goal>
            </goals>
        ...

此战争中包含应用程序使用的映射器文件和logback文件,该文件位于:src/main/resources/logback.xml/src/main/resources/mappers/our-mapper.xml下。

在构建战争时,这些文件会在our.war/WEB-INF/classes/logback.xmlour.war/WEB-INF/classes/mappers/our-mapper.xml

下发送到我们期望的地方并希望它们发送到

当我们打包我们的程序集以进行部署时,我们需要将这些文件从战争中分离出来,我们使用程序集描述符来完成:

<assembly>
    <formats>
        <format>tar.gz</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <files>
        <file>
            <source>target/${build.finalName}.war</source>
            <outputDirectory>${tomcat-instance}/webapps</outputDirectory>
        </file>
        <file>
            <source>src/main/resources/logback.xml</source>
            <outputDirectory>${tomcat-instance}/resources/</outputDirectory>
        </file>
    </files>
    <fileSets>
        <fileSet>
            <directory>src/main/resources/mapper</directory>
            <outputDirectory>${tomcat-instance}/resources/mapper/</outputDirectory>
            <includes>
                <include>**/*</include>
            </includes>
        </fileSet>
    </fileSets>
</assembly>

在Maven中配置:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <descriptors>
            <descriptor>src/main/resources/our-assembly.xml</descriptor>
        </descriptors>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

这构造了程序集,但我关注的是logback.xmlmappers/our-mapper.xml文件仍包含在war内的assembly.tar.gz中。

是否可以保持程序集外部程序集中包含.xml文件的配置,但也有内部的战争汇编的.tar.gz程序集会排除这些相同的文件,因此它们在类路径中不会出现两次?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

您现在可能已经找到了解决此问题的解决方案或解决方法 - 但是,我很想知道这是否可行,因此我创建了一个与您描述的文件结构相同的小型测试项目。

我设法让这个项目构建出两个war文件 - 包含.xml文件的程序集外部的文件,以及不包含.xml文件的程序集内的文件。我通过创建一个额外的程序集来实现这一点,该程序集构建了一个明确排除.xml文件的第二个临时war文件。然后现有的程序集包含这个新的war文件,而不是默认的war。

新程序集war-assembly.xml如下所示:

<assembly>
    <id>temp</id>
    <formats>
        <format>war</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <fileSets>
        <fileSet>
            <directory>target/${build.finalName}</directory>
            <outputDirectory>/</outputDirectory>
            <includes>
                <include>**/*</include>
            </includes>
            <excludes>
                <exclude>**/logback.xml</exclude>
                <exclude>**/mapper/*</exclude>
            </excludes>
        </fileSet>
    </fileSets>
</assembly>

然后修改现有的程序集以包含新的war文件:

<assembly>
    <formats>
        <format>tar.gz</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <files>
        <file>
            <source>target/${build.finalName}-temp.war</source>
            <outputDirectory>${tomcat-instance}/webapps</outputDirectory>
            <destName>target/${build.finalName}.war</destName>
        </file>
        <file>
            <source>src/main/resources/logback.xml</source>
            <outputDirectory>${tomcat-instance}/resources/</outputDirectory>
        </file>
    </files>
    <fileSets>
        <fileSet>
            <directory>src/main/resources/mapper</directory>
            <outputDirectory>${tomcat-instance}/resources/mapper/</outputDirectory>
            <includes>
                <include>**/*</include>
            </includes>
        </fileSet>
    </fileSets>
</assembly>

然后修改pom.xml以在现有程序集之前引用新程序集。

<descriptors>
    <descriptor>src/main/resources/war-assembly.xml</descriptor>
    <descriptor>src/main/resources/our-assembly.xml</descriptor>
</descriptors>

这似乎工作正常。它确实将-temp war文件放在target文件夹中,可能会被删除以避免混淆。