1

我们的项目设置为打包 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.xmlandmappers/our-mapper.xml文件仍然包含在war包含在assembly.tar.gz.

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

提前感谢您的帮助。

4

1 回答 1

2

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

我设法让这个项目构建了两个战争文件 - 一个包含 .xml 文件的程序集外部,一个包含 .xml 文件的程序集内部。我通过创建一个额外的程序集来实现这一点,该程序集构建了第二个明确排除 .xml 文件的临时战争文件。然后现有程序集包含这个新的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战争文件留在了target文件夹中,可能会被删除以节省任何混乱。

于 2013-11-28T14:25:06.247 回答