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さんから聞いた内容
聞いた感想+内容詳細
自分理解での感想なので間違えも多多あるかと思います。Java使いな皆様、ご指摘いただければ幸いです。
IDEの話
IntelliJの話が殆どなかった。意外。
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
- java
- test
- web
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サーバの上にアプリをのっける。
軽量級と重量級がいる。
まとめな感想
一言で言うと予想以上に面倒くさくてカオスだった。準備だけで面倒くさくて投げたくなるという。
あと、これだけの内容をPCもなしに*32時間以上喋ったmasanobuimaiさんはマジぱねえっす。
実際にはもっと内容あったと思いますが、私が理解出来なかったり、取りこぼしました。勿体ない!
お時間頂いて喋ってもらいました分、しっかりと精進したいと思います。
というわけで「創るJava」も注文しました。いじょ
追記:masanobuimaiさんがフォロー書いてくれました。
http://d.hatena.ne.jp/masanobuimai/20100720#1279637667