Top / Maven2 / TIPS集

-source 1.3 でサポートされていません とか言われる場合

ソースのバージョン - TzlTTqTjの日記を参考にさせていただきました!ビルドの設定を下記のように書き替えればよい

<build>
   <plugins>
     <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-compiler-plugin</artifactId>
       <configuration>
         <source>1.5</source>
         <target>1.5</target>
       </configuration>
     </plugin>
   </plugins>   
 </build>

さらにtargetタグにつづけて

<encoding>Windows-31J</encoding>

とか指定すれば、文字エンコーディングによるコンパイルエラーなども回避できるぽい。

フェーズ

フェーズとは mvn complieとかmvn installとか、プロジェクトをビルドするための一つの集まりのこと。フェーズを指定するとそれに関連付いたゴールが一つ以上実行される。関連づけは、そのプロジェクトのアーティファクトのタイプやpom.xmlの情報から、Mavenが勝手に判断するらしい。

またフェーズには validate -> compile -> test -> deployなどと実行順序などが定義されている。これをビルドライフサイクルという。

デフォルトのライフサイクルは

${MAVEN_HOME}/lib/maven-core-2.0.7-uber.jar#META-INF/plexus/components.xml

に定義されている。components.xml

リポジトリにプロキシ経由で接続する

~/.m2/settings.xml

に以下の記述を書いておきます。

<settings>
  <proxies>
    <proxy>
      <active>true</active>
      <protocol>http</protocol>
      <host>hogehoge.jp</host>
      <port>81</port>
      <username>fuga</username>
      <password>fuga</password>
      <nonProxyHosts>www.google.com|*.hoge.jp</nonProxyHosts>
    </proxy>
  </proxies>
</settings>

プロジェクト作成。

mvn archetype:create -DgroupId=nu.mine.kino.mavensample -DartifactId=kino-app

グループIDとプラグインIDを指定するんですね。

pom.xmlからEclipseのプロジェクトを生成する。

mvn eclipse:eclipse

これでEclipse関連のファイルができあがります。以後、Eclipse上で管理できるわけですね。

出力されるファイル内で

M2_REPO

という変数を使用しているので、Eclipseの変数としてM2_REPOを定義しておきます。値はローカルリポジトリへのパスを指定しておきます。

プロジェクトの構成を出力する

通常pom.xmlはデフォルト値は省略されますが、それを省略しないで出力します。

mvn projecthelp:effective-pom

コンソールに

<?xml version="1.0"?><project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>nu.mine.kino.mavensample</groupId>
  <artifactId>kino-app</artifactId>
  <name>kino-app</name>
  <version>1.0-SNAPSHOT</version>
  <url>http://maven.apache.org</url>
  <build>
    <sourceDirectory>t:\workspace3.2\kino-app\src\main\java</sourceDirectory>
    <scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>
    <testSourceDirectory>t:\workspace3.2\kino-app\src\test\java</testSourceDirectory>
    <outputDirectory>t:\workspace3.2\kino-app\target\classes</outputDirectory>
    <testOutputDirectory>t:\workspace3.2\kino-app\target\test-classes</testOutputDirectory>
    <resources>
      <resource>
        <directory>t:\workspace3.2\kino-app\src\main\resources</directory>
      </resource>
    </resources>
    <testResources>
      <testResource>
        <directory>t:\workspace3.2\kino-app\src\test\resources</directory>
      </testResource>
    </testResources>
    <directory>t:\workspace3.2\kino-app\target</directory>
    <finalName>kino-app-1.0-SNAPSHOT</finalName>
    <plugins>
      <plugin>
        <artifactId>maven-projecthelp-plugin</artifactId>
        <version>2.0-beta-1</version>
      </plugin>
    </plugins>
  </build>
  <repositories>
    <repository>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <id>central</id>
      <name>Maven Repository Switchboard</name>
      <url>http://repo1.maven.org/maven2</url>
    </repository>
  </repositories>
  <pluginRepositories>
    <pluginRepository>
      <releases>
        <updatePolicy>never</updatePolicy>
      </releases>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <id>central</id>
      <name>Maven Plugin Repository</name>
      <url>http://repo1.maven.org/maven2</url>
    </pluginRepository>
  </pluginRepositories>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <reporting>
    <outputDirectory>target/site</outputDirectory>
  </reporting>
</project>

が出力されました。ファイルにリダイレクトして、ちょこちょこ編集して使うことができて便利です。デフォルト値がでてるのがよいですね。

settings.xmlの構成を出力する

mvn help:effective-settings -Doutput=effective-settings.xml

でデフォルトのsettings.xmlが出力される

ローカルリポジトリを変更する

デフォルトは

~/.m2/repository

のヤツ。Mavenのインストールディレクトリ配下などにある、settings.xmlで変更可能です。

<?xml version="1.0"?><settings>
 <localRepository>~/.m2/repositoryNew</localRepository> <-こんな感じ。
 <servers>...
 </servers>
</settings>

http://slashdot.jp/~pluto/journal/328571

依存するライブラリを追加する

Mavenは必要なライブラリがローカルにあるかを探し、なかったらネット上のリポジトリを探しに行きます。で必要なライブラリですが、pom.xmlで以下のように指定します。

 <dependencies>
   <dependency>
     <groupId>junit</groupId>
     <artifactId>junit</artifactId>
     <version>3.8.1</version>
     <scope>test</scope>
   </dependency>  dependencies内に複数かける
 </dependencies>
<groupId />
<artifactId />
<version />

は必須みたいですね。

サイトを作成する

作成したサイトに、様々な情報を載せる

ソースをjarにする

mvn package

でjarが作成されます。

ローカルリポジトリにjarを配置する

mvn install

で該当プロジェクトがローカルリポジトリ(~/.m2のことです)にインストールされます。複数のプロジェクトが依存しあってる構成で開発するときはローカルリポジトリに自分のライブラリをインストールすることで、再帰的(?)に開発すればよいのかな?つまり

ProjectA
ProjectB <- ProjectAに依存してる

場合、まずProjectAをinstallして、んでProjectBはpom.xmlでProjectAに依存してる、と書いておく、と。

ちなみにインストールしたときのディレクトリ構成ですが

groupId(の.を/で切ったモノ)/artifactId

となるのでgroupIdは適度な長さにしておいた方が良さそうです。EclipseのプラグインIDだと失敗するな(´д`;)↑もうやっちゃった(´д`;)

ローカルリポジトリに任意のjarを追加する

たとえば以下のコマンドで

mvn install:install-file -DgroupId=javax.transaction -DartifactId=jta \
-Dversion=1.0.1B -Dpackaging=jar -Dfile=jta-1_0_1B.jar

jta-1_0_1B.jar というファイルが上のグループID,プラグインID,バージョンでローカルリポジトリに追加されます。

Mavenのpom.xmlのスキーマ

pom.xmlの説明

site:deployで、作成したサイトをWEBに公開する。

mvn clean site-deploy

で、htmlドキュメントを作成して所定のサーバにアップすることができます。pom.xmlには以下の内容を書いておく必要があります。

<?xml version="1.0"?>
<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>nu.mine.kino.mavensample</groupId>
  <artifactId>kino-app</artifactId>
  <name>kino-app</name>
  <version>1.0-SNAPSHOT</version>
  <url>http://maven.apache.org</url>
  <ciManagement>
  略
  <distributionManagement>
    <site>
      <id>ftp-site</id>      ↓プット先のディレクトリ
      <url>ftp://[サーバ名]/var/www/html/hoge</url>
    </site>
  </distributionManagement>
  <build>
    <extensions>
      <extension>
        <groupId>org.apache.maven.wagon</groupId>
        <artifactId>wagon-ftp</artifactId>
        <version>1.0-beta-2</version>
      </extension>
    </extensions>
    <sourceDirectory>source</sourceDirectory>
  略
</project>

上の例ではFTPでアップするよう指定しているので、

~/.m2/settings.xml

にアップするFTPアカウントを指定しておく必要があります。

  • settings.xml
     <settings>
      <!--
      <proxies>
        <proxy>
          <active>true</active>
          <protocol>http</protocol>
          <host>hogehoge.jp</host>
          <port>81</port>
          <username>fuga</username>
          <password>fuga</password>
          <nonProxyHosts>www.google.com|*.hoge.jp</nonProxyHosts>
        </proxy>
      </proxies>
      -->
      <servers>
        <server>
          <id>ftp-site</id>
          <username>hogehoge</username>   <-FTPアカウント
          <password>fugafuga</password>
        </server>
      </servers>
    </settings>

以上でOKです。。っていいたいところですが、なぜかこれだけでも失敗しちゃいました。ネットにあんまり情報がないところを見ると環境依存なのかもしれないのですが、

bash-3.2$ mvn site:deploy
[INFO] [site:deploy]
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Wagon protocol 'ftp' doesn't support directory copying
[INFO] ------------------------------------------------------------------------
[INFO] For more information, run Maven with the -e switch
[INFO] ------------------------------------------------------------------------

というように、なぜか

Wagon protocol 'ftp' doesn't support directory copying

ってでちゃうんですね。

site:deployでFTPに失敗する。

さて

Wagon protocol 'ftp' doesn't support directory copying

の話です。どうも調べていくと Maven WagonってのはMavenの中で開発されているライブラリ群のようです。うえのpom.xmlにもあるように、 wagon-ftp の 1.0-beta-2 というバージョンのjarだとこれがでちゃうみたい。っていってもこれがMavenのリポジトリ上の最新版みたいなので、ちょっと困ってました。

結局MavenのSubversionのtrunkから最新のソースを取ってきて、jarを作成しました。具体的には WagonのサイトSubversionのURLを確認して /trunk/wagon-providers/tags/wagon-1.0-beta-2/wagon-providers をcheckoutして、wagon-1.0-beta-2 の FtpWagon?.java を最新と差し替えて

cd wagon-1.0-beta-2/wagon-providers/wagon-ftp
mvn clean package

でjarを作り直してローカルリポジトリのjarを差し替えちゃいました。

これでめでたくFTPプットができるようになりました。

jarに同梱するリソースを指定する。

デフォルトではsrc/main/resources/内のファイルはパッケージング時に自動的にjarの直下に格納されるようです。

例えばEclipseのプラグインのようにプロジェクト直下(つまりpom.xmlのとなり)に存在するファイルをjarに格納したい場合は

 <build>
   <sourceDirectory>source</sourceDirectory>
   <scriptSourceDirectory>main/scripts</scriptSourceDirectory>
   <testSourceDirectory>test</testSourceDirectory>
   <outputDirectory>classes</outputDirectory>
   <testOutputDirectory>target\test-classes</testOutputDirectory>
   <resources>
     <resource>
       <directory>.</directory> <-ここ↓
       <includes>
         <include>plugin.xml</include>
         <include>plugin.properties</include>
       </includes>
     </resource>
   </resources>
   ................
 </build>

とすればよい。

独自のMANIFEST.MFを同梱したい。

MANIFEST.MFはMavenが勝手に同梱しちゃうけど、EclipseのプラグインはMANIFEST.MFに色々定義を記述するので、それをそのまま格納したいです。それはプラグインで行います。

 <build>
   .......
   <plugins>
     <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-jar-plugin</artifactId>
       <configuration>
         <archive>
         <manifestFile>META-INF/MANIFEST.MF</manifestFile>
         <manifest>
           <addDefaultSpecificationEntries>false</addDefaultSpecificationEntries>
           <addDefaultImplementationEntries>false</addDefaultImplementationEntries>
         </manifest>  ↑この二つはまだ用途不明。
         </archive>
       </configuration>
     </plugin>
     ...........
   </plugins>
 </build>

でもどうもMANIFEST.MFを読み込んでMavenが勝手にいじってしまうらしく、うまくいきません(´д`;)。

http://maven.apache.org/plugins/maven-jar-plugin/source-repository.html

自分で作っちゃう?

プラグインのソースコードを入手する

基本的にhttp://maven.apache.org/plugins/のプラグインの一覧から、調べたいプラグインをさがして、そのプラグイン用のサイトに遷移。んで左のメニューからソースリポジトリのURLが書いてあるページに飛べばいい。


この記事は

選択肢 投票
おもしろかった 24  
そうでもない 4  

Top / Maven2 / TIPS集

現在のアクセス:59730


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-10-11 (土) 22:55:31 (1018d)