Javaの環境まわりについてレクチャーしてもらった

7月15日、 id:masanobuimaiさんにお願いして、Javaの環境まわりについて、マンツーマンで講義してもらったよ。
なんという贅沢でしょう。masanobuimai ++
おかげで大分理解が進みました。まだ怪しいですが、とりあえずのとっかかりは掴めました。
ありがとうございました〜。

経緯

そもそもなんでJava環境について知りたかったのかというと・・
Scalaお勉強してると、まわりの環境色々にひっかかるわけです。web上からサンプル拾ってきて動かしたり、書き換えてみたりすると、LL言語ばっかやってる身としては、例えばビルドツールとか配備の仕方とかにひっかかります*1
よくあるサンプルなんかはパッケージ切ったりしないで1ファイルだったりするので、scalacでコンパイルすればOKだったりするのですが、web上から参考になりそうなものとか探してくると、とたんにどこになにが置いてあるのかよく分からないとか、pom.xmlってなんぞという世界に突入してしまうと。
んで、どうもJavaからの経緯とか、Javaでのお約束事を知ってないとなんか駄目かなと。
というような経緯でmasanobuimaiさん召喚と相成りました。

先に結論

注:Scala勉強していく上でという但し書きつきで。
Web上から拾ってきたScalaで書かれたプロジェクトをいじってみるには、NetBeansとりあえず、プロジェクトとして開いてみるといいと。NetBeansは(標準状態でも)pom.xmlをマウントできるから。
Scalaの場合、sbtやmaven等である事が多い。
で、sbtとmavenのプロジェクト構成は互換性がある。というか、sbtがMavenを下敷きにしている?
ので、NetBeansで開いてみればとりあえず構成とか見られる。
あと、そういう環境まわりも知りたくて一冊Java本を買うなら「創るJava」がオヌヌメらしい。

masanobuimaiさんに聞きたかった内容*2

masanobuimaiさんから聞いた内容

  • ビルドツールの歴史等
  • IDEの話
  • Javaのエディション
  • 各ツールなどでのプロジェクト構造
  • クラスパスの話、Jarファイルの配置
  • 別バージョンとの共存
  • Servlet,JavaEEの配備とか

聞いた感想+内容詳細

自分理解での感想なので間違えも多多あるかと思います。Java使いな皆様、ご指摘いただければ幸いです。

ビルドツールの歴史

make→ant(makeのJava版)→maven というような流れ。
そしてこれが一番の衝撃だった。
よく使うパターンはあるが、統一したプロジェクト生成、構造の定番はない。
なんだってー!!
ライブラリ(Jar)の置き場所も定番はないらしい。
mavenのおかげでリポジトリ(iBiblio)は出来たらしい。しかしFLOSSしかない。プロプライエタリーなやつはない。
頭の出来がいい所はローカル(インハウス)にリポジトリを持ち、自前のプロプライエタリーなやつもそこに置いて一括管理したりしてる。
ツール類は勝手にインスコしてねの世界らしい。

Javaのエディション

3つ

JavaEE

エンタープライズアプリケーション。要するにwebアプリケーション作成向け

JavaSE

デスクトップアプリつくったりとか

JavaME

モバイル。JDKのサブセット

IDEの話

IntelliJの話が殆どなかった。意外。

eclipse

JavaEE不得意。素ではアレなので、プラグインを入れまくる必要がある。

NetBeans

実は中身はAnt。ビルド時にnbproject以下にあるprivateというフォルダ以下に、OS環境依存なパスとかプライベートな情報がゴリゴリ書かれるようになっている。
バーション管理するときには気をつけろ?

各ツールのプロジェクト構造等

Ant

build.xmlに書く。

maven,sbt等

pom.xmlに、プラグイン、依存するライブラリ、バージョンなどを記述する。
mavenやsbtで使うpom.xmlには先人の知恵が詰まっている。
mavenは、書いたライブラリをごそっと取ってきたりもしてくれる。Ruby的にいうと、rake+rubygemsという感じか?
mavenの実際の流れでいうと、プロジェクト生成時に選んだアーキテクトタイプパターンから、ある程度pom.xmlを生成してくれる。
で、依存ライブラリとか欲しいライブラリは、自分でpom.xmlにごりごり書く必要がある。
guiとかでさくさくとか便利なもんはそんなないと。
それが辛いので最近はIvyというものがあるという話?違うらしい。IvyはMavenからライブラリの依存性解決だけを抜き出したツールだそうです。
あと、maven3からはGroovyでDSLにPomが書ける。
おまけ。Groovyの場合はGradle→Gantらしい。
構成はいろいろ。例えばこんなとか?

  • mvn
    • target(ビルドされたものが置かれる)
    • src

mavenにはgoalというのがあって、それによって、プロジェクトを、配備までとかビルドまでとか、サーバー動かすとか色々指定できる?

クラスパスの話、Jarファイルの配置

まずは基本的なクラスパス。どこか?
JDKがもってるやつは以下
JAVA_HOME\jre\lib\ext

Macはちょっと特殊。/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home/lib/extとか。
どこにセットするのか?
基本的に、グローバルに設定しない方がいい。
前述の場所にJarファイルを置けば使えるが、全てのプロジェクトに影響を与えてしまう。
環境変数CLASSPATHに新たな場所を書いてしまうのも、全てに影響を与えてしまうので避ける。
なので、プロジェクト毎に設定する。Antの場合ならbuild.xmlに書いとくのがいい。mavenならpom.xmlに書く。
あと、余計な事をするアホなインストーラもあったりするので注意。
Windows\system32にjava.exeを置いちゃったり、CLASSPATHを追加してしまったりするこまったちゃんも。

別バージョンとの共存

前述の通り、jarに関しては解決出来るが、Java本体のバージョンなどが問題となる。
scalaの場合はコンパイラーのjarとかをプロジェクト毎に置けるので、バージョンとかjavaほど困らない。
Javaの場合はコンパイラーをjarで配布とかしてないので、PCの環境に依存してしまう。
なので、いくつかのバージョンを入れておいて、JAVA_HOMEやANT_HOMEを書き換えることで対処する。

  • Java
    • jdk1.4.2_01
    • jdk1.6.0_20
    • jre6

JAVA_HOMEの差し先を変更する

  • tools
    • ant171
    • ant181

ANT_HOMEを変更。みたいな
人数が多いプロジェクトだと、環境を整えるだけでも一苦労ですね・・

Servlet,JavaEEの配備とか

APサーバ。Rubyでいえばmongrelとか、Webrick
APサーバの上にAPサーバのっけることも出来る。←これは間違い。APサーバの上にアプリをのっける。
軽量級と重量級がいる。

軽量級

乱暴にいうとJSP+Servlet

重量級

乱暴にいうと、軽量級に+EJB

配備

プロジェクトをWARファイルにして、コンテナ上に配備すればいい。
warファイルは要するに無圧縮のzip。プロジェクトを所定の配備形式でパッケージングしたもの。
warファイルの構成についてはmasanobuimaiさんの図を参照。
上の、WEB-INFの下にsrc置くのはアホな例なので真似しちゃ駄目との事。src置いちゃっているのは、サーバーでの配備環境のまんまローカルでも開発、管理してて、ftpでアップロードとかいう駄目な例の為だったと思う。

デプロイイメージについてもこちらの図を参照。

まとめな感想

一言で言うと予想以上に面倒くさくてカオスだった。準備だけで面倒くさくて投げたくなるという。
あと、これだけの内容をPCもなしに*32時間以上喋ったmasanobuimaiさんはマジぱねえっす。
実際にはもっと内容あったと思いますが、私が理解出来なかったり、取りこぼしました。勿体ない!
お時間頂いて喋ってもらいました分、しっかりと精進したいと思います。
というわけで「創るJava」も注文しました。いじょ


追記:masanobuimaiさんがフォロー書いてくれました。
http://d.hatena.ne.jp/masanobuimai/20100720#1279637667

*1:もちろん言語仕様でもジェネリックスとかひっかりますがそれはそれ

*2:あやふやな理解で想像してみたものなので重複してたり、おかしな項目もあるかと思います

*3:一応私のMac&Vistaを必要な場面では使いましたが