2007年2月6日

Maven2: 將指定目錄、檔案一併打包

先前提過個人習慣將一個軟體開發專案的相關資訊統統塞入部署包裝 (jar / war) 檔中,昨晚終於從別人家(就是 radeox 啦)的 pom.xml 中找到範例。
一開始的想法是以為在 resources 區段中直接指明要將某一目錄掛到部署包裝檔中,不過實作後發現檔案複製的方式與期望不符,因此不可行(也可能只是不會設定)。
後來,從前述 radeox 的 pom.xml 中發現其實 Maven2 可以整合 ant 的任務 (task) ,只要透過 maven-antrun-plugin 這個 plugin 即可。所以若想將整個 src/ 目錄放進部署包裝檔的話,只要在 build 區塊下使用 maven-antrun-plugin 並指定相關任務 (tasks) 內容後即可包裹出含有 src/ 目錄的部署包裝檔。
<build>
  <plugin>
    <artifactId>maven-antrun-plugin</artifactId>
    <executions>
      <execution>
        <id>copy-source</id>
        <phase>generate-sources</phase>
        <configuration>
          <tasks>
            <echo>Copying src/ to target jar. </echo>
            <copy todir="${project.build.outputDirectory}/src">
              <fileset dir="src/"/>
            </copy>
            <copy todir="${project.build.outputDirectory}"
                  file="pom.xml"/>
          </tasks>
        </configuration>
        <goals>
          <goal>run</goal>
        </goals>
      </execution>
    </executions>
  </plugin>
</build>
現在,最頭大的是那些 expression 變數要在那邊查啊?

※ 2007-02-07 補充:先前可能真的設定錯誤,以下的設定可以讓 maven2 自動完成檔案複製的動作而無需 antrun 的介入。
<resources>
  <resource>
    <directory>${basedir}</directory>
    <includes>
      <include>src/**</include>
    </includes>
  </resource>
  <resource>
    <directory>${basedir}</directory>
    <includes>
      <include>pom.xml</include>
    </includes>
  </resource>
</resources>

※2010-11-18 補充:最後實作的方式是在 maven-war-plugin 中操作,如下:
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-war-plugin</artifactId>
  <version>2.0.2</version>
  <configuration>
    <docencoding>UTF-8</docencoding>
    <webResources>
      <resource>
        <filtering>true</filtering>
        <directory>src/main/webapp</directory>
        <includes>
          <include>**/*.xml</include>
        </includes>
      </resource>
      <resource>
        <directory>${basedir}</directory>
        <includes>
          <include>src/**</include>
        </includes>
      </resource>
      <resource>
        <directory>${basedir}</directory>
        <includes>
          <include>pom.xml</include>
          <include>initial.sh</include>
        </includes>
      </resource>
    </webResources>
  </configuration>
</plugin>