共勉
"诸君离学校而去了。在社会上立身的困难,恐怕比在学校里求学还要加甚。若非立志奋斗,则以前所受的教育,反足以增加人生的苦恼,或转为堕落的工具。这是诸君所当特别注意的。事业的成功,须经过长时间的辛苦艰难——成功的代价,走过了许多荆棘的路,方才能寻获康庄大道。立志是砍荆棘斧斤,奋斗是劳力。万不可希望以最少的劳力,获最大的成功。" -- 蒋梦麟
Knight's Blog
滴滴海浪技术主管, 前百度资深研发工程师,现居上海。 擅长于大规模的系统平台服务架构。在

- 亿级别搜索平台(sov5.cn)
- 大规模分布式爬虫
- 中间件架设(disconf,CanalX)
- 广告平台(百度联盟广告)
- 租车平台(滴滴租车)
- 语言招聘平台(51tra.com)
- 内容平台(100weidu.com)
- 社区平台(python88.com)
- 资源下载平台(misou.com)
- 计算机图形图像技术(一篇一作)
- 机器学习(一篇一作)

等领域具有颇有经验。
联系方式: knightliao AT gmail.com
联系
Knight's Blog » 工作

Maven War包 POM配置文件 设置最佳实践

2014-08-29 14:17

如何为你的Web程序(war包设定配置文件)

约定

http://maven.apache.org/plugins/maven-war-plugin/examples/adding-filtering-webresources.html

上面链接说了:

The default resource directory for all Maven projects is src/main/resources which will end up in target/classes and in WEB-INF/classes in the WAR. The directory structure will be preserved in the process.

The WAR Plugin is also capable of including resources not found in the default resource directory through the webResources parameter.

默认是找 src/main/resource 目录的配置作为War包的配置,如果没找到,则可以使用用户自定义的,如下面,用户定义了目录 resource2 作为自定义目录。

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.4</version>
        <configuration>
          <webResources>
            <resource>
              <!-- this is relative to the pom.xml directory -->
              <directory>resource2</directory>
            </resource>
          </webResources>
        </configuration>
      </plugin>
    </plugins>
  </build>
  ...
</project>

例如,如果你的项目目录如下:

 .
 |-- pom.xml
 |-- resource2
 |   |-- external-resource.jpg
 |   `-- image2
 |       `-- external-resource2.jpg
 `-- src
     `-- main
         |-- java
         |   `-- com
         |       `-- example
         |           `-- projects
         |               `-- SampleAction.java
         |-- resources
         |   `-- images
         |       `-- sampleimage.jpg
         `-- webapp
             |-- WEB-INF
             |   `-- web.xml
             |-- index.jsp
             `-- jsp
                 `-- websource.jsp

那么,执行上面的POM之后,WAR包内容应该如下:

documentedproject-1.0-SNAPSHOT.war
 |-- META-INF
 |   |-- MANIFEST.MF
 |   `-- maven
 |       `-- com.example.projects
 |           `-- documentedproject
 |               |-- pom.properties
 |               `-- pom.xml
 |-- WEB-INF
 |   |-- classes
 |   |   |-- com
 |   |   |   `-- example
 |   |   |       `-- projects
 |   |   |           `-- SampleAction.class
 |   |   `-- images
 |   |       `-- sampleimage.jpg
 |   `-- web.xml
 |-- external-resource.jpg
 |-- image2
 |   `-- external-resource2.jpg
 |-- index.jsp
 `-- jsp
     `-- websource.jsp

大家可以看到,这个WAR包不仅有 src/main/resource 目录下的配置,还有 resource2下的配置。

说明,WAR的配置,来自两个地方,一个是默认的,一个是用户添加的。

如何覆盖?

我们最常见的用户场景是:

src/main/resource 目录下有开发的所有配置

src/main/online-resource 目录下有线上配置。它不包含所有配置。它只包含 src/main/resource 目录下那些需要被替换成线上配置的配置文件。也就是 开发和线上配置 的公同配置文件 是不会存在这个目录下的。

那么,我们的想法就很简单了,线上WAR的配置应该包括:

  • 首先,应该包括 src/main/resource 目录下所有文件
  • 然后,使用 src/main/online-resource 覆盖上面这个目录,将线下配置覆盖成线上配置,共同配置保留下来。

如何完成 以上操作呢?

https://github.com/knightliao/disconf/blob/master/disconf-web/pom.xml 这里提供了一个最佳实践:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <configuration>
        <webResources>

            <resource>
                <directory>${project.build.online.sourceDir}</directory>
                <targetPath>WEB-INF/classes</targetPath>
                <includes>
                    <include>**/*.*</include>
                </includes>
            </resource>

        </webResources>
    </configuration>
</plugin>

只需要像上面这样配置,Maven帮我们默认执行了第一步(首先,应该包括 src/main/resource 目录下所有文件),我们自定义了第二步,Maven会帮我们覆盖掉。

6430 次点击