Skip to main content

6 posts tagged with "IntelliJ"

View All Tags

· 2 min read

Mac(Yosemite)にIntelli Jを入れてあるんだけど、起動するとJava 6を使えと言われる。 これは設定ファイルを少しいじればJava 8で起動するようになる。

設定を変更する​

/Applications/IntelliJ IDEA 14.app/Contents/Info.plist このInfo.plistファイル内を "JVMVersion" で検索すると、次のように1.6と表記されている。

<key>JVMVersion</key>
<string>1.6*</string>

これを次のように1.8にする。

<key>JVMVersion</key>
<string>1.8*</string>

あとはいつもどおりIntelli Jを起動するだけ。

Info.plistまでどうやって到達する?​

Info.plistファイルに到達する手順は大きくふたつ。

  • Terminal.appを使う場合
    1. Terminal.appを開く
    2. cd /Applications/IntelliJ IDEA 14.app/Contentsと打つ
  • Finderを使う場合
    1. Finderを開く
    2. アプリケーションを開く
    3. IntelliJ IDEA 14を右クリックしてパッケージの内容を表示を選択する
    4. Contentsフォルダを開く

あとはInfo.plistがあるので、好きなエディタで編集する。

· 3 min read

最近、IntelliJも応答なしになりながらも、だいぶテキパキと動いてくれてはいるんだけど、mercurialとの相性がよくなくて困ってた! IntelliJからコミットしようとすると "0x83" があるぞって怒られて、コミットできない。 仕方なく、Terminalからコミットしていたんだけど、ファイル数が多かったり、複数ディレクトリに散らばったりしてるとどのファイルをコミットしたいのかわかりづらい。 便利アプリあるかなぁ〜と思ったけど、MacHgもmurkyもしっくりこなくて、IntelliJでなんとかすることにした!

昨日、寝ながら "Terminalからならコミット出来てるのになぁ…" と考えていたらふとひらめいた! IntelliJをTerminalから起動すればいいのでは?と。 実際、これでうまくいった。

前提

Terminalからコミットが出来る環境を作っておくこと。 mercurialの環境構築は情報が結構あると思うので、そちらを参考に。ここにも設定を載せておくけど、ここは調査が甘いので、こうしない方がよかったり、冗長だったりするかもしれない。
cat .bash_profile
export LANG=ja_JP.UTF-8 export LC_ALL=ja_JP.UTF-8
cat .hgrc
[ui] username = ken

[defaults] add = --encoding=utf-8 clone = --encoding=utf-8 commit = --encoding=utf-8 pull = --encoding=utf-8 push = --encoding=utf-8 remove = --encoding=utf-8 revert = --encoding=utf-8

手順

一応、具体的に手順を書いておく。 今使っているIntelliJ CEはEAPなので、パスは "/Applications/IdeaX-IC-103.161.app" です。 まずは、Terminalの起動。
cd /Application open IdeaX-IC-103.161.app
これで、普通にmercurialにコミットしたら日本語が通りました。

ん?もしかして?

IDEA+sbt-appengineで流れるような開発で環境変数を見てくれないって書いたけど、こういう起動にすれば環境変数を見てくれるんじゃない? appengine pluginのAPPENGINE_SDK_HOMEとか、JREBEL_JAR_PATHとか、使えるようになりそうな予感。

· 6 min read

最近、IntelliJ IDEAがモーレツに遅くて、使い物にならなかった。 遅いというか、ファイルを保存しただけで応答がなくなり、強制終了する始末。 結果的に直ったので、直し方(というほどではない)とその間に得たことを書いておこうかな。

環境

環境はMacBook(Late 2008)で、Snow Leopard(10.6.6)。SSD+メモリ8GB。 IntelliJ IDEA Community Edition EAP 103.161。 主にScala用途。

EAPというのは "Early Access Program" のことらしい。詳細は下記ページ参照。 ■ IDEA X EAP - IntelliJ IDEA - Confluence

http://confluence.jetbrains.net/display/IDEADEV/IDEA+X+EAP

経緯と症状

初めから重たくて使えなかったわけではなく、当初は結構快適に使ってました。バージョンを10.0.1から10.0.2に上げてからおかしくなった気がする。 症状は上述のとおりIntelliJが急に重たくなり、終いには応答しなくなっていた。原因は今もわからないんだけど、プロジェクトファイル(?)が壊れたのかな? 10.0.1から10.0.2にしたときは、OSが32bitモードで動いていたので、これも関係あるのかも?IDEAと32/64bitのことについては後述。

直し方

直し方というほどのものではなく、プロジェクトを作り直しただけ。 ".idea" ディレクトリをごっそり消して ".iml" ファイルも全部消した。 その後、新たにIDEAでプロジェクトを作ったら快適な環境に戻ってきました♪

重たいときは、SBTコンソールでエンターを押すと "> > >" みたいなプロンプトが改行が追いつかない状態だったんだけど、今は綺麗に改行されてます。あのくるくる(待ち時間が長い時に出るカラフルな風車?)もほとんど出なくなった。

IDEAをより快適に使うために

IDEAの動作を元に戻そうと色々と調べてる間にいくつか得た情報がある。大きくは2つあって、ひとつはIDEAの設定。もうひとつはVMのパラメータ設定。

Inspectionを減らせばいいらしい。

調べてる間にわかったことのひとつに、32/64bitモードが関係しているかもしれないということ。 ■ IntelliJ IDEA 10.0.2 EAP build 103.39 | JetBrains IntelliJ IDEA Blog

http://blogs.jetbrains.com/idea/2011/02/intellij-idea-1002-eap-build-10339/IDEA 10.0.2からは64bitに最適化してあるのか、起動時にもバルーンが出て関連ページへ誘導してくれる。 今はOSもアプリも64bitで動作させてます。 アプリを32bitモードで起動したい場合は、ファインダーでアプリのアイコンを右クリック → 情報を見る →  "32ビットモードで開く" にチェックを入れます。

IDEAのVMのパラメータの指定方法はいくつかある。

  1. 環境変数 "IDEA_VM_OPTIONS" を指定する
  2. $IDEA_HOME/bin/idea.vmoptionsに記述する
  3. info.plistに書く

1も2も$IDEA_HOME/bin/idea.shを見れば書いてあることなんだけど、2はうまく動作しなかったなぁ。なんか書き方を間違っていたっぽい。 info.plistの存在意義とか知らないから、本来はここに書くべきじゃないのかもしれないけど、書いたら設定は反映されました。IDEAの右下のメモリの量が変わるのでわかりやすい。 ちなみに今は "-Xms512m -Xmx512m -XX:MaxPermSize=512m" という設定にしてる。最小と最大を同じにしておくと可変する必要がなく、少しはパフォーマンスがよくなるかも?という話なので、そうしてみた。

IDEAがおかしい時は上記のどれを試しても改善されることはなかったから、上記の設定なんていらないのかもしれないけど🙄

まとめ

IDEAの挙動がおかしいと思ったらプロジェクトを作り直すのが手っ取り早い!! Twitterで情報くださったり、気にしていただいた方々に感謝です!

· 5 min read
前回の投稿でIDEAとsbt-appengineが連携してくれたのは嬉しいけど、ソースを修正するたびにappserverの再起動は面倒!! 出来ることなら、IDEAでコーディング→ブラウザ確認→コーディング→...と繰り返したい。

こちらも実現できたので、方法を紹介。 やったことはこれだけ。

  • JRebelでクラスリローディング
  • クラスファイルの出力先をwebapp配下にする
  • sbtでソースコード監視

環境を簡単に書いておくと、IDEA+sbt(appengine plugin)という組み合わせ。 MyProjectがあって、その下にSubProject1, SubProject2がある構成。このMyProjectとかSubProjectはsbtの管理下にある状態。

まずはJRebelの導入から。 JRebel自体は有償だけど、Scala開発者にはライセンスを提供してくれてるのでこれを活用。 ■ ZeroTurnaround

http://sales.zeroturnaround.com/jrebel.jarを適当な場所に置く。ライセンスファイルもjarと同じところに置いておく。

JRebelでクラスリローディング

クラスリローディング対象とするディレクトリを指定するために、rebel.xmlを作成する。 MyProject/src/test/resources/rebel.xml
<?xml version="1.0"?>
<application>
<classpath>
<dir name="/Users/ken/workspace/MyProject/SubProject1/target/scala_2.8.1/classes" />
<dir name="/Users/ken/workspace/MyProject/SubProject2/target/scala_2.8.1/classes" />
</classpath>
</application>

続いて、sbtでJRebelを有効にする。 sbt-appengine-pluginではJREBEL_JAR_PATHを指定するだけでJRebelが有効になるはずなんだけど、IDEAのsbtコンソールでは環境変数を見てくれないらしいので、直接指定します。 MyProject/project/build/Project.scala

override def scanDirectories = Nil
override val devAppserverJvmOptions = List("-Xdebug", "-Xrunjdwp:transport=dt_socket,server=y,address=2011,suspend=y") ++ List("-noverify", "-javaagent:/Users/ken/dev/jrebel/jrebel.jar") ++ super.devAppserverJvmOptions

JRebelに関係するのは

List("-noverify", "-javaagent:/Users/ken/dev/jrebel/jrebel.jar")

の部分。 ちなみに、XdebugとかはIDEAで接続するための記述。

クラスファイルの出力先をwebapp配下にする

JRebelの設定も終わったので、あとはIDEAからsbtを実行すればいいんだけど、sbtの出力先がappengineの出力先(webapp)とは異なっているためsbtの "~ compile" で監視をしても意味が無い。

そこで、SubProjectの出力先をwebapp配下にします。具体的には、MyProject/SubProject1/target/scala_2.8.1/classesを削除して、MyProject/target/scala_2.8.1/webapp/WEB-INF/classesにシンボリックリンクを張る。 手動でシンボリックリンクを張ればいいんだけど、sbt cleanを実行すると再度やり直さなければならないので、symlinkアクションを作った。 MyProject/project/build/Project.scala

import java.lang.Runtime
lazy val symlinkInstance = new Symlink
lazy val symlink = symlinkAction
def symlinkAction = task { args => task { symlinkInstance(args); None } }
class Symlink() extends Runnable {
def run() = {
def exec(command:String) = Runtime.getRuntime.exec(command)
val subs = Set("SubProject1", "SubProject2")
val webapp = outputPath / "webapp" / "WEB-INF" / "classes"

log.info("Creating directory %s".format(webapp))
exec("mkdir -p %s".format(webapp))

subs.foreach { sub =>
log.info("Processing for %s.".format(sub))
val path = "%s/%s".format(sub, mainCompilePath)
val command = "ln -s ../../../%s %s".format(webapp, path)

log.info("Removing directory %s".format(path))
exec("rm -fr %s".format(path))

log.info("Creating symlink %s -> %s".format(path, webapp))
exec(command)
log.info("")
}
None
}

def apply(args:Seq[String]):Option[String] = {
new Thread(this).start()
None
}

}

コード中の val subs = Set("SubProject1", "SubProject2")" を各自の環境に合わせてください。

sbt reload後に "symlink" アクションが追加されているので、実行してパスを確認して下さい。サブプロジェクトのclassesがシンボリックリンクになっているはず。

使い方

  1. sbtで "symlink" を実行。
  2. IDEAでデバッガ実行(=sbtも起動。前回の投稿参照)
  3. sbtで "~ compile" を実行

簡単に仕組みを説明。 symlinkを実行することによって、appserverの管理下にクラスファイルを出力するようになります。単にシンボリックリンクを張るだけなので初回だけ。sbt cleanしたときは再度実行します。 続いて、IDEAでデバッガを起動し、sbtの "~ compile" を実行してソースファイルを監視します。ソースコードに修正があった場合はsbtの監視によってコンパイルされ、クラスファイルが生成されます(生成先はsbt symlinkによってappsever管理下になっている)。 ブラウザからアクセスすると、JRebelによってクラスの再読込が行われ、sbtには "JRebel: Reloading class 'package.path.to.ClassName'." と出力されます。

これで、IDEAからsbtを起動し、ブラウザで確認しつつコードを書いていくことが出来る♪

· 3 min read

IDEAとsbtを連携してデバッグしたいと思っていたところ@pomu0325さんが解決してくれた。 だけど、appengineの起動はsbtコンソールにdev-appserver-startと入力しなくてはならず、面倒。 どうせなら、IDEAのデバッグ時に一緒にappserverも起動して欲しい。 これを解決する方法がわかったので、紹介。

まずはpomu0325さんのところにも記述があるように "Before launch" の "Run SBT Action" に "dev-appserver-start" を指定する。 このままIDEAから実行してもappserverは起動するんだけど、dev-appserver-startを実行直後にIDEAが接続に行くらしく、コネクションが張れずにエラーとなってしまう。 ということは、コネクションを張るタイミングを遅らせてあげればいいはず。

MyProject/project/build/Project.scalaに以下を追記。

override def devAppserverStartTask(args:Seq[String]) = task {
val status = devAppserverInstance(args)
Thread.sleep(5000)
status
}

これによってdev-appserver-startを実行後、5秒(5000ms)スリープする。 この5秒というのは各自のマシンスペックと相談して、適当に変更してください。

あとはsbtでreload後、IDEAでデバッグするだけ。 appserver起動後にIDEAがコネクションを張りに行くはずです。

余談だけど、こんな記述をしておくとちょっと楽できるかも?

lazy val start = devAppserverStartAction
lazy val stop = devAppserverStop

sbtでdev-appserver-startのエイリアスとしてstartを定義してます。同様にstopも。 appserverの起動はIDEAから可能だけど、sbtのappserverを停止するときにstopが役立つかも?

· 5 min read

IDEAとsbtで開発するための手順。 今回はsbtでベースを作り、IDEAで開発環境を構築する方法。

■ An integrated SBT + IDEA Scala Development Setup ← Decodified

http://www.decodified.com/scala/2010/10/12/an-integrated-sbt-and-idea-scala-dev-setup.html参考にしたサイトはこちら。

使ったことはないが、sbtの定義ファイルからIDEAのプロジェクトファイルを作ってくれるsbt pluginもあるらしい。 ■ sbt-idea 0.1.0 - implicit.ly

http://implicit.ly/sbt-idea-010

以下が本題の手順。

前提

プロジェクトとして "Hello"を、サブプロジェクトととして "World" を作成することにする。 (HelloProject…ハロプロ?…まぁ、いっか)

最終的にはIDEAのプロジェクトとして "Hello" を、モジュールとして "World" が出来ることになる。

sbtの準備

sbtのインストールはご自由に。 ■ simple-build-tool - Project Hosting on Google Codehttp://code.google.com/p/simple-build-tool/

MacBookにはhomebrewの環境を作ってあるので、うちはこれでインストール完了。

brew install sbt

実際に利用するjarファイルはここにインストールされる。 /usr/local/Cellar/sbt/0.7.4/libexec/sbt-launch-0.7.4.jar

sbtによるHelloプロジェクト作成

まずはHelloプロジェクトを作成。
$ cd $WORKSPACE $ mkdir hello $ cd hello $ sbt[object Object]
exitでsbtから抜ける。

続いて、Worldモジュールを作成。

$ mkdir world $ cd world/ $ sbt Project does not exist, create new project? (y/N/s) y Name: World Organization: Hello Version [1.0]: Scala version [2.7.7]: 2.8.1 sbt version [0.7.4]:

exitでsbtから抜ける。

これで、sbtを利用したHelloプロジェクトとWorldモジュールの作成を完了。

IDEAプロジェクトの構築

File - New Project...からプロジェクトの作成を開始する。このまま次へ進む。"Name" は気にせず "Project files location" を選択する。選択するとNameも変更されます。 "Create module" のチェックは外しておく。

プロジェクトの作成は完了したので、続いてモジュールの作成に移る。

真ん中のペインの上にある "+" を押し、モジュールを追加する。次へ進む。モジュールを選択し、次へ進む。"Do not create source directory" を選択し、次へ進む。何も選択せず、次へ進む。"Source Folders", "Test Source Folders", "Excluded Folders" を設定。隣の "Paths" タブを選択し "Output path" と "Test output path" を設定。

sbtコンソールを使う

sbtプラグインを入れておく。sbt-launch.jarのパスを設定しておく。下の "SBT Console" を押すとコンソールが出てくるので、緑色の再生ボタンを押す。 これでsbtが起動したら完了。

トラブルシューティング

最後のsbt起動の際に、sbtの設定を完了しておかないとIDEAが固まる現象が発生した。固まってしまったら、Terminalからsbtのプロセスをkillすることで解決する。

実際に活用するのはこれからなので、使いやすさなどは不明。 IntelliJ IDEAとsbtは使いやすいという噂を聞いたことはあるが、実際に設定手順をまとめてるサイトがなかったので、簡単に書いてみた。