创建一个 zip 文件并使用 maven 将其添加到 war 文件

Create a zip file and add it to a war file with maven

我有一些示例 RESTful 客户端项目,它们与我正在处理的 RESTful Java Web 服务一起使用。基本上,不应构建这些项目,而是将其压缩并包含在 war 文件中,以便在部署 war 文件时将它们作为静态资源提供。这使得更新示例客户端和实际 Java Web 服务变得容易,并保证它们一起部署。

我已经能够使用 maven 程序集插件创建一个 zip 文件,但该阶段在 war 阶段之后执行。我一直无法弄清楚创建 zip 文件然后将其添加到 war 文件所需的 Maven 咒语。

这是我目前所拥有的,但它只完成了大约一半的工作。另外,我需要移动 ExampleProject 目录,这样解压缩的文件就不会进入最终的 war 文件。

pom.xml

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <descriptor>src/assembly/AssembleExamples.xml</descriptor>
        <finalName>examples.zip</finalName>
    </configuration>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

AssembleExamples.xml

<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>bin</id>
    <formats>
        <format>zip</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <fileSets>
        <fileSet>
            <directory>${project.basedir}/WebContent/docs/</directory>
            <outputDirectory/>
            <includes>
              <include>ExampleProject/pom.xml</include>
              <include>ExampleProject/src/**</include>
            </includes>
        </fileSet>
    </fileSets>
</assembly>

两个插件 maven-war-pluginmaven-assembly-plugin 需要在同一阶段执行,package。首先是 maven-assembly-plugin,然后是 maven-war-plugin。您需要按以下顺序添加插件,以确保它们 运行 在同一阶段和正确的顺序:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.0.1</version>
    <executions>
        <execution>
            <id>prepare-war</id>
            <phase>package</phase>
            <goals>
                <goal>exploded</goal>
            </goals>
        </execution>
    </executions>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <descriptor>src/assembly/AssembleExamples.xml</descriptor>
        <finalName>examples.zip</finalName>
    </configuration>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

您可以使用 mvn package 生成 war

这是我最终的做法。

感谢 Mithun,我意识到有两种方法可以配置 war 插件,而我的做法并不适合我的情况。

这是我添加到我的 pom 文件中的内容:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <executions>
        <execution>
            <configuration>
                <descriptor>src/assembly/AssembleJavaExample.xml</descriptor>
                <finalName>myexample</finalName>
                <appendAssemblyId>false</appendAssemblyId>
                <outputDirectory>${project.build.directory}/${project.build.finalName}/docs</outputDirectory>
            </configuration>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>
<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <warSourceDirectory>WebContent</warSourceDirectory>
        <failOnMissingWebXml>true</failOnMissingWebXml>
        <warName>mywar</warName>
        <warSourceExcludes>docs/myexample/**</warSourceExcludes>
    </configuration>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>war</goal>
            </goals>
        </execution>
    </executions>
</plugin>

程序集插件必须先执行,这样它才能在 war 插件之前执行。程序集插件创建 zip 文件并将其放在 war 插件用来创建 war 文件的目录中(outputDirectory 配置)。然后我不得不将示例源排除在 war 文件(warSourceExcludes 配置)中。我不确定这是否是最好的方法,但看起来效果很好。