Vagrant + Jetty + Intellij IDEAでリモートデバッグ

Webアプリを作成していて、現在時間を変更しないといけないケースというのがあります。ローカル環境で開発してると時間を変更すると色々問題なので、Vagrantを使うと便利です。

ローカルのpom.xmlを以下のようにしてビルドするときにrootディレクトリ以下にWEB-INFとかができるようにします

    <build>
        <finalName>root</finalName>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <includes>
                        <include>**/*Tests.java</include>
                    </includes>
                </configuration>
            </plugin>
        </plugins>
    </build>

最初にVagrantからアプリに参照できるようにします。Vagrantfileに下記を追加すると、Vagrantから参照できます。便利。

config.vm.synced_folder "<ローカルパス>", "/vagrant_data"

Vagrantに入れるJetty(ゲストJetty)のwebappsにシンボリックリンクを作成

ln -s /vagrant_data/target/root $jetty.home/webapps/root

リモートデバッグできるようにVagrant に入れたJettyのstart.iniにこれを追加

--module=jmx
--exec
-Xdebug
-agentlib:jdwp=transport=dt_socket,address=9999,server=y,suspend=n
-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.port=1099
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-DOPTIONS=jmx

あと、hostname -i コマンドを実行した時に、127.0.0.1と表示されるとJMXがうまくいかないらしいので、/etc/hostsを変更

#127.0.0.1   CentOS CentOS localhost localhost.localdomain localhost4 localhost4.localdomain4
192.168.33.10 CentOS CentOS localhost localhost.localdomain localhost4 localhost4.localdomain4

この時点でVagrant上のjettyを立ち上げて、http://:8080 へアクセスしてつながることを確認。

次にIntelliJ IDEAのRun/Debug Configurationsから[Jetty Server] → [Remote]を選択します。言葉で書くよりも画像を見てもらったほうが早いので、キャプチャをペタリ。ちなみに192.168.33.10はVagrant側のIPです


これで多分大丈夫。pom.xmlのfinalNameを変更せずにhttp://:8080 にアクセスする方法がわからなかったので、知ってる人は教えていただけると非常に助かります。。。