IntelliJで複数のプロジェクトを開く方法

きっかけはこちらのつぶやき。


IntelliJにはEclipseの「ワークスペース」とかNetBeansみたく複数のプロジェクトをまとめて管理しとくって考え方は無く,「プロジェクト」とそれに関連した「モジュール」という考え方で,IntelliJインスタンスは「プロジェクト」単位に起こす。
File->Open PorjectやReopenでプロジェクトを選ぶと,こんなダイアログが表示されると思う。


ここで「New Window」を選ぶと,別のIntelliJでプロジェクトが開くので,結果的に複数のプロジェクトを同時に表示できる。ただ,IntelliJのプロセスもその分増えるので,マシンにとってやさしくない。:-Pウソでした。プロジェクトを複数開いてもIntelliJのプロセスは1つのままでした。
といっても,これが普通だと思っていたので,関係無いプロジェクトを横断して何かしたいと思ったことが無いので, [twitter:@t_wada] さんのつぶやきはちょっと新鮮だった。:-)


ちなみに,IntelliJ/Eclipse/NetBeansのプロジェクトまわりの用語の違いは以下の通り*1

IntelliJ Eclipse NetBeans
Project workspace 該当無し/もしくはProject Group
Module Project Project


あと,t_wada さんがまとめたtogetterはこちら。
JetBrains 製 IDE (IntelliJ, RubyMine, WebStorm 等) で小さいプロジェクトをたくさん扱うには - Togetter



IntelliJでそんなことやろうと思っても出来ないか?というとそうでもなくて,「依存関係のあるモジュール」をまとめて「プロジェクト」を作るけど,別に「依存関係なくても」プロジェクト作れるんだよね。と,思ったので,実際にやり方を解説しときます。


まず,テキトーなプロジェクトを作っとく。既存のモジュールのとりまとめ用プロジェクトなので「Create module」のチェックは外して,プロジェクトだけ作る。


空っぽのプロジェクトは,プロジェクトディレクトリにIntelliJのプロジェクトファイル(./ideaディレクトリ)があるだけ。ドット付きなのでMacLinuxからはぱっと見空のディレクトリにしか見えない。ちなみに,IntelliJ以外のJetBrains製品もプロジェクトディレクトリには./ideaディレクトリができたはず。


あとは,そのプロジェクトにまとめたいモジュールを取り込む。IntelliJの場合は,File->Project Structure*2からモジュールの追加を選び「Import existing module」で,取り込みたいモジュールを指定する。ちなみに,モジュールってのは*.imlファイルのことね。


あとは,取り込みたいモジュールの分,この作業を繰り返すだけ。取り込んだモジュールは,もともとどこかのプロジェクトに属しているはずなので,取り込んだプロジェクトディレクトリは相変わらず空のまま。


普通はプロジェクトディレクトリの配下にモジュールを作るんだけど,実のところプロジェクトとモジュールがどこにあるかは関係ない。なので,余所のプロジェクトのモジュールを取り込み(Import existing module)と言ってるけど,どっちか言うとリンクに近いかな。


気をつける事としては,取り込んだモジュールのSDKや出力ディレクトリは「プロジェクトの指定に合わせる」になってた場合,不幸な結果になる事もあるので,必要に応じてモジュール個別に設定し直した方が良いかも知んない。正直,ちょっとメンドイかも。
まずは,出力先(先ほどと同じ,Project Structureで設定する)。こっちはプロジェクト依存(Inherit project compile output path)であっても,モジュールごとに出力先が異なるので,ほっといても大丈夫かも。


つづいてSDK。「Project SDK」が指定してあると,あるプロジェクト下のモジュールは「すべて同じSDKを使う」って事になるので,異なるSDKを使っているモジュールをまとめた場合は,モジュールごとにSDKを指定しとかないと変なエラーがでるかも知んない。


と,こんだけしんどい事すればEclipseワークスペースモドキをIntelliJでも作れるわけだ。


ちなみに,ちゃんと依存関係持たせたいとか,あるモジュールをライブラリとしてプロジェクトに参加させたいと言った本来の使い方については,こちらを参照のこと。
IntelliJで他のプロジェクトをライブラリプロジェクトとして読み込む - 仙台 Ruby Vim JavaScript フリーランスプログラマ

おまけ:その1

そんでだ。そこまで面倒かけずに,ちょいとファイルをチラ見したいだけだったら,プロジェクト外のファイルをIntelliJのエディタ部分(下図のオレンジ枠)にドラッグ&ドロップすればいい。


いつのバージョンからかは忘れたけど,こんな風にプロジェクト外のファイルもIntelliJで開いて編集できる。


むろん,拡張子に応じたシンタックスハイライトも効くし,Javaのファイルとかだと,放り込んだプロジェクトのクラスパスに応じたコード補完とかもしてくれる。あとファイルを開きっぱにしとけば,次回そのプロジェクトを開いたときも,そのファイルを覚えて開いてくれる(閉じちゃっても,Recent Filesでまた開けるけど)。結構,至れり尽くせりだったりするのだ。:-)


あと,下らない話だけど,IntelliJのbinディレクトリ(($IDEA_HOME/binMac OSの場合,$IDEA_HOME/Contents/MacOS))にある idea.batidea コマンド経由でもファイルを開けるってヤツ。これは知ってたけど,実際に使った事は無い。


こんな感じにファイルパス渡すと,現在動いているIntelliJインスタンス(とそのプロジェクト)にそのファイルを開いてくれる。


IntelliJが動いてない状態でコマンド叩くと,IntelliJを起動するけど,プロジェクト開いてないってんでエラーになるだけなので気をつけてね。
あと,diffオプション付けて2つのファイルを指定すると,diffビューで開いたりもする。

$ idea diff file1 file2

一応,これらの件はヘルプに書いてたりもする。
http://www.jetbrains.com/idea/webhelp/working-with-intellij-idea-features-from-command-line.html

おまけ:その2

プロジェクト外のファイル開いたら,そこを頼りにNavigation Barから,他のファイルを辿れるとか...。

おまけ:その3

ワークスペースがないからプロジェクト横断した検索ってできないんじゃね?」とふと思いついたけど,実はできた(知らなかったw)。
Editor->Find->Find in Path...で検索ダイアログ出して,Scopeを「Directory」にするだけだった。この場合,IntelliJのインデックス効かないから遅いけど。

*1:参考:Install IntelliJ IDEA - Help | IntelliJ IDEAInstall IntelliJ IDEA - Help | IntelliJ IDEA

*2:IntelliJ以外だと「Project Structure」自体が存在しないみたいなので,たぶんFile->Settingsから設定すんだと思う