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

时间:2015-02-24 22:34:36

标签: maven maven-3 maven-assembly-plugin

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

我已经能够使用maven程序集插件创建一个zip文件,但该阶段在战争阶段后执行。我无法找出创建zip文件所需的maven咒语,然后将其添加到war文件中。

这是我到目前为止所做的,但它只做了大约一半的工作。此外,我需要移动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>

2 个答案:

答案 0 :(得分:1)

其中两个插件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>

您可以使用war生成mvn package

答案 1 :(得分:0)

以下是我最终如何做到这一点。

感谢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配置)。我不确定这是不是最好的方法,但它似乎运作得很好。