タツノオトシゴのブログ

主にJavaに関するものです。

MavenからEclipseのProject Facetをカスタマイズする

Mavenを使用していて「mvn eclipse:eclipse」を実行したときに、Eclipeの「Project Facets」が、自分の意図したとおりにできない場合がある。

特に「Dnynamic Web Modules」のバージョンを3.0に指定したい場合。


Eclipseの画面上からは、プロジェクトの「Properties」―「Project Facets」から設定できる。
この設定は、ファイルとしては、「.setting/org.eclipse.wst.common.project.facet.core.xml」で保持されている。

<faceted-project>
  <fixed facet="jst.java"/>
  <fixed facet="jst.web"/>
  <installed facet="jst.java" version="1.7"/>
  <installed facet="jst.web" version="3.0"/>
</faceted-project>


この「org.eclipse.wst.common.project.facet.core.xml」ファイルを書き換える方法は、mavenc eclipse pluginの設定を変更する。設定方法は2つある。

方法(1):差分の情報を追加する

pom.xmlタグで下記のように指定する。


このタグの中に、追加したい情報を任意のタグ名で記載する。
1.1」と指定した場合、facet属性がタグ名、version属性がタグの値になる。


↓のサイトに記載されている。
Apache Maven Eclipse Plugin - Additional Facets

      <plugin>
        <artifactId>maven-eclipse-plugin</artifactId>
        <configuration>
          <additionalProjectFacets>
            <jst.jsf>1.1<jst.jsf>
            <jst.ejb.xdoclet>1.2.3</jst.ejb.xdoclet>
            <jst.web.xdoclet>1.2.3</jst.web.xdoclet>
          </additionalProjectFacets>
        </configuration>
      </plugin>


ただし、この方法は、標準で設定されていないものを指定する際に有効。
標準とは、Java、Webのことをいう。

Javaのバージョンは、maven compiler pluginで指定可能だが、webの場合はこの方法ではうまくいかない。

方法(2):ファイルの内容を直接指定する

「org.eclipse.wst.common.project.facet.core.xml」ファイルを直接設定する方法がある。


↓のサイトに例が載っている。
WTP Eclipse project generation from Maven configuration | Jrialland's Blog

<properties>
    <java.version>1.7</java.version>
    <servlet-api.version>3.0</servlet-api.version>
<properties>
<plugins>
    <plugin>
        <artifactId>maven-eclipse-plugin</artifactId>
        <configuration>
            <downloadSources>true</downloadSources>
            <downloadJavadocs>true</downloadJavadocs>
            
            <wtpversion>2.0</wtpversion>
            <!-- ファイルの中身を直接指定する -->
            <additionalConfig>
                <file>
                    <name>.settings/org.eclipse.wst.common.project.facet.core.xml</name>
                    <content><![CDATA[
<faceted-project>
<fixed facet="jst.java"/>
<fixed facet="jst.web"/>
<installed facet="jst.java" version="${java.version}"/>
<installed facet="jst.web" version="${servlet-api.version}"/>
</faceted-project>
                    ]]></content>
                </file>
            </additionalConfig>
        </configuration>
    </plugin>
</plugins>


ここまでするくらいなば、Eclipseの画面から設定した方がよい場合もあるが、できるだけ自動化したい人は設定するとよいかも。


Gradleが使用できるならば、プログラムがけるため、ファイルの中身を文字列置換した方が早いと思う。