Dropwizard 1.0.0 から Server::Starterいうものを使った
Hot Deploy ができるようになったようで、
当時は「ローカル環境そんな遅くねーし、まあいいか。」くらいで思っていたのですが、
時を経て「ローカル環境そんな遅え。」と思うようになりました。
Server::Starter から簡単に Java プロセスを起動できるようになった - tokuhirom’s blog
記載がありましたが、macだとうまく動いてないっぽいですが、うまくいかないなりに、うまくいったので、
試してみた結果を記載します。


前提

  • OS Mac OS 10.12.6 です。

    sw_vers -productVersion 
    ------------------------
    10.12.6
    ------------------------
    

  • java version 1.8.0_45 です。

    java -version
    ------------------------
    java version "1.8.0_45"
    Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
    Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)
    ------------------------
    

  • dropwizard version
    1.1.2 です。

    <dependency>
        <groupId>io.dropwizard</groupId>
        <artifactId>dropwizard-core</artifactId>
        <version>1.1.2</version>
    </dependency>
    


参考


手順

Dropwizard のアプリケーションが作成済であることが前提です。
また、perl 関連のlibrary は何もインストールされておりません。

1. Server::Starterのインストール

  • cpanm のインストール
    そもそも cpanm がなんなのかよくわからなかったのですが、
    perlモジュールのinstallにcpanmを使う|perl|@OMAKASE
    見る限り、java でいうところのmaven とか gradle python でいうところのpip のようなものだと理解しました。
    mac だと、brew で install できるようなので、brew コマンドで install を実施します。
    brew install cpanminus
    ----------------------------------------------------
    /usr/local/Cellar/cpanminus/1.7043: 6 files, 381.5KB, built in 25 seconds
    ----------------------------------------------------
    

インストール (成功パターン)

  • sudo 付きで Server::Starter自体のインストール

    sudo cpanm Server::Starter
    -----------------------------
    9 distributions installed
    -----------------------------
    

  • start_server 実行

    start_server 
    -----------------------------
    server program not specified
    -----------------------------
    
    うまく動いているようです。

補足 インストール (失敗パターン)

以下は、最終的に失敗してますので、実施しないほうがいいです。
参考情報として載せております。

  • Server::Starter自体のインストール

    cpanm Server::Starter
    ----------------------------------------------------
    9 distributions installed
    ----------------------------------------------------
    

  • PATHの追加 (失敗)
    何故かstart_serverへのPATHが通ってなかったので、
    .bash_profile にPATHを追加しました。

    # Server::Starter
    export PERL5BINPATH=/Users/user_name/perl5/bin/start_server
    export PATH=$PATH:$PERL5BINPATH
    

  • start_server 起動
    一旦以下、素のstart_server叩いてみたところ、

    start_server
    
    以下エラーが発生しました。
    Can't locate Server/Starter.pm in @INC (you may need to install the Server::Starter module) 
    
    再度、
    cpanm Server::Starter
    
    実行すると、
    !
    ! Can't write to /Library/Perl/5.18 and /usr/local/bin: Installing modules to /Users/user_name/perl5
    ! To turn off this warning, you have to do one of the following:
    !   - run me as a root or with --sudo option (to install to /Library/Perl/5.18 and /usr/local/bin)
    !   - Configure local::lib in your existing shell to set PERL_MM_OPT etc.
    !   - Install local::lib by running the following commands
    !
    !         cpanm --local-lib=~/perl5 local::lib && eval $(perl -I ~/perl5/lib/perl5/ -Mlocal::lib)
    !
    
    いうWarning が出力されておりましたので、sudoつけて、再実行しました。

  • PATHの削除 追加したPATHを削除しました。

    # Server::Starter
    #export PERL5BINPATH=/Users/user_name/perl5/bin/start_server
    #export PATH=$PATH:$PERL5BINPATH
    

2. Server::Starter 経由で、Dropwizard の起動

Dropwizard の java プロジェクトのディレクトリで起動コマンドを叩きます。
指定している develop.yml には、以下のように inheritChannel指定をしています。

  • develop.yml

    server:
      type: default
      gzip:
          enabled: true
          minimumEntitySize: 256B
          bufferSize: 8KB
      applicationConnectors:
        - type: http
          port: 11080
          inheritChannel: true
      adminConnectors:
        - type: http
          port: 11443
    

  • 起動
    port が同じだと、jetty が起動しなかったため、
    dropwizard の起動が11080 なのに対して、
    start_server の起動は、10180しました。
    inheritChannel: trueしても、inheritChannel: falseしても、
    挙動変わらずで、Mac だと、inheritChannel効いていないのかもしれません。1
    [1]. inheritChannel設定がstart server の設定に影響するのかっつーとよくわかってないですが、たぶんそんな感じがします。

    start_server --daemonize \
    --log-file=start_server.log \
    --pid-file=start_server.pid \
    --status-file=start_server.status \
    --port=10180=0 \
    java -- -jar ./target/{dropwizard_project}.jar server develop.yml
    

  • 再起動

    start_server --pid-file=start_server.pid --status-file=start_server.status --restart
    

  • 停止

    start_server --pid-file=start_server.pid --stop
    

  • 補足 サーバー起動した後、jar を固めた時の動作

    mvn package  
    
    起動したjar ファイルを再度固め直すと、「MAINプログラムがない」
    で、java のプロセスが落ちた後、start_server によって、再起動が走るという動作になり、
    一瞬プロセスは切れますが、アプリケーションは新しいjarへと切り替わります。


Maven exec-maven-plugin と、IntelliJ の keyboard shortcut でもう少し起動を早くする

毎度毎度、mvn package やるのはそれなりに遅いので、
exec-maven-plugin と、Bash スクリプト を IntelliJ の keyboard shortcut に割り当てて
もう少し立ち上がりまでを早く実施できるようにしてみます。

exec-maven-plugin の設定

exec-maven-plugin定義をpom.xml に追加します。
ymlは${project.basedir}/develop.yml記載することで、親pomから実行しても、
子pomから実行しても実行可能になります。

  • pom.xml に追記

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.6.0</version>
            <executions>
                <execution>
                    <goals>
                        <goal>java</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <mainClass>
                    xyz.monotalk.festivals4partypeople.web.dropwizard.start.Festivals4PartyPeopleApplication
                </mainClass>
                <arguments>
                    <argument>server</argument>
                    <argument>${project.basedir}/develop.yml</argument>
                </arguments>
            </configuration>
        </plugin>
    
    これで、mvn exec:java Dropwizard アプリケーションが立ち上がります。

  • 依存するオレオレjar を mvn install する
    以前は、親pom 経由で全プロジェクトビルドをかけていたので、うまくいってたのですが、
    Dropwizardアプリケーションが依存するオレオレjar が mvn exec:java では、ビルドされず、
    エラーとなっていたので、事前に以下コマンド実行で、依存するオレオレjarをinstallしました。

    mvn install -pl myproject1
    mvn install -pl myproject2
    

Server::Starter経由で、Dropwizardを起動するスクリプトの作成

起動、再起動、停止を実行するスクリプトを作成しました。
起動コマンドで叩きにいくのは、jar ではなく、exec:java で、
起動、再起動については、Server::Starter コマンド実行後に、
ログのtail を行うようにしました。

  • wep_app_start.sh

    #!/usr/bin/env bash
    # start_server
    start_server --daemonize \
    --log-file=start_server.log \
    --pid-file=start_server.pid \
    --status-file=start_server.status \
    --port=11080=0 mvn exec:java
    # tail log
    tail -f -n 1000 start_server.log
    

  • web_app_restart.sh

    #!/usr/bin/env bash
    # restart server
    start_server --pid-file=start_server.pid --status-file=start_server.status --restart
    # tail log
    tail -f -n 1000 start_server.log  
    

  • web_app_stop.sh

    #!/usr/bin/env bash
    start_server --pid-file=start_server.pid --stop
    

スクリプトを、External Tools として IntelliJ の keyboard shortcut に割り当てする

上記のスクリプトを External Tools として、IntelliJ に登録、keyboard shortcut に割り当てます。

  • External Toolsとして登録
    Preferences を開き、Tools > External Tools を選択します。
    External Tools1
    +ボタンを押して、対象のスクリプトを登録します。
    External Tools2

  • keyboard shortcut に割り当て
    Preferences を開き、Keymap > External Tools から登録したスクリプトを
    ショートカットに割り当てます。
    キー組み合わせでの登録ができますので、私は[Command + @] + [Command + 1] とかで割り当てました。
    Keymap

これで、 wep_app_start.shサーバー起動、
プログラム修正して [Command + B] でビルド、
wep_app_restart.shサーバー再起動、
web_app_stop.shサーバー停止がショートカットでいけるようになりました。
2
[2]. 実は、Dropwizardアプリケーション を IntelliJ から起動、[Command + B]でコンパイル 、IntelliJ から再起動でもなかなかのスピードで実施できるという説もあります。

以上です。

コメント