2011年1月15日土曜日

[netbeans][maven] 恐る恐るのmaven体験

mavenを使えない現場で、Javaプロジェクトのディレクトリ構造を
mavenライクにしてやって来ましたが、リアルmavenを使って
ハッとしたことのメモ。

発端
--------------------------------------------------
Antの<script>タスクを調べていました。<script>タスクは、
AntでAnt以外のスクリプトを書けるようにするやつ。
JavaScript以外の言語を特に何も調達せずに使えるかなと。
beanshellってのが使えるとAntの中にJavaを書けていいなと。

BeanShell
http://www.beanshell.org/

<script>タスクはant-apache-bsf.jarが実体なので、それをAntのlibで探していたら、
ant-apache-bsf.jar の隣に ant-apache-bsf.pom があるじゃないですか。

Antがmavenで作られていた!?

類似
・タワーレコードの店員がAmazonで実は買っている。
・エコカーの開発者がガソリン車で通勤している。

mavenってWEB-INFとか出て来るWebアプリケーションの開発の
イメージ(勝手な)がありました。そうではないらしい。使ってみますかさっそく。

調達と設定
--------------------------------------------------
NetBeans 6.9.1
Apache Maven 3.0.2

NetBeans ≫ ツール ≫ オプション ≫ Maven
外部 Maven ホーム:J:\Program Files\apache-maven-3.0.2
ローカルリポジトリ:J:\java\repository

※Cドライブに空きがないので。

プロジェクトを作る
--------------------------------------------------
NetBeans ≫ ファイル ≫ 新規プロジェクト ≫ Maven ≫ Mavenプロジェクト

Maven原型:Mavenクイックスタート原型(1.0)

あとは適当に。。

デフォルトでいきなり困ったこと
--------------------------------------------------
・コンパイルのレベルが1.3だった。
プロジェクトプロパティ ≫ ソース
ソース/バイナリ形式:1.6

・JUnitが3系でできあがっちゃった。
pomを書き換え。
---
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.8.2</version>
    <scope>test</scope>
  </dependency>
---

いまさら知ったこと(ぽかーん)
--------------------------------------------------
・必要なライブラリが勝手にダウンロードされるのは知っていたけど、
mavenのプラグインも同じく。そこは意識できていないから
ネットからクローズした自社リポジトリを作るのは難易度高そう。

・今までプロパティファイルをデフォルトパッケージに置いていたけど違った。
×:src/main/java/log4j.properties
○:src/main/resources/log4j.properties
確かにプロパティファイルはJavaではないです。

・targetディレクトリがsvn無視だった。コミット対象外。

・targetディレクトリにclassesとtest-classesが出来ていた。
binじゃないのね。

・targetディレクトリにビルドしたjarが置かれていた。
distじゃないのね。

・ローカルリポジトリにjarやらpomやら一式がコピーされていた。
そっか。他のプロジェクトが参照するjarになり得るものね。
targetがsvn無視なのは、こういうことか。

・ビルドしたらテストケースが動いた。テストスィート書いてないのに。
これうれしい。

・ビルドするjarの名前はpomに記述した情報から自動的に付けられる。
プロジェクト名.jar ではない。これうれしい。今はリネームしている。

・pomにバージョンを書ける。これうれしい。
今はインストーラを作るAntに書いている。

・pomもリリース対象。これうれしい。
このjar何モノ?ってね。情報が欲しい。依存ライブラリとかバージョンとか。



※ファイル名・ディレクトリ名がグレーなヤツがsvn無視です。
※nb-configuration.xmlを無視にしたのは私。IDE依存な情報なので除外に。

1時間ぐらいだったけどすんごい勉強になりました。
ではまた。

[java][log] 使うか使わないかcommons-logging

自分には log4j-1.2.x がデファクトで、コード中でしっかりimportしています。
が、それはいかがなものかというコンセプトの commons-logging を使ってみました。
commons-loggingを使うと、どうもこういうことらしい。
  • Loggerの実装(例えばlog4j)の選択を後回しにして、でもアプリケーションの実装には着手できます。
  • プロパティファイルの変更(など)だけで、Loggerの実装を変更できます。
こんなシチュエーションに一度も遭遇したことがないけれど。
自分のPCを探してみると結構 commons-logging は使われていました。
(正確に言うと同梱していました。)
  • Oxygen XML Editor
  • DITA Open Toolkit
  • Ant
やっぱり一枚挟んでおくのが礼儀ですか。

◆Javaコード:App.java
-----------------------------
package com.hisagisoft.tomorrowscode.logger;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class App {
  private static final Log log = LogFactory.getLog(App.class);

  public static void main( String[] args ){
    log.info("this is log.");
    System.out.println( "Hello World!" );
  }
}
-----------------------------

◆プロパティファイル:commons-logging.properties
-----------------------------
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
-----------------------------

◆プロパティファイル:log4j.properties
-----------------------------
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c(%L) - %m%n

log4j.appender.null=org.apache.log4j.varia.NullAppender

log4j.rootLogger=debug, null
log4j.logger.com.hisagisoft=debug, stdout
-----------------------------

◆これらの配置



























◆実行(NetBeans上で、です)
------------------------------
run:
2011-01-15 20:41:30,062 [main] INFO  com.hisagisoft.tomorrowscode.logger.App(15) - this is log.
Hello World!
構築成功 (合計時間: 0 秒)
------------------------------


◆結論
手に入るときは使うようにします。

ではまた。