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がServer::Starterを使ったhot Deployに対応しました - @matsumana の技術メモ
-
普通のデーモンを 1) Server::Starterでホットデプロイ+ 2) slow-restart対応にする - Qiita
手順
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
というWarning が出力されておりましたので、! ! 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) !
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 を固めた時の動作
で起動したjar ファイルを再度固め直すと、「MAINプログラムがない」mvn package
で、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 を選択します。
+
ボタンを押して、対象のスクリプトを登録します。
-
keyboard shortcut に割り当て
Preferences を開き、Keymap > External Tools から登録したスクリプトを
ショートカットに割り当てます。
キー組み合わせでの登録ができますので、私は[Command + @] + [Command + 1] とかで割り当てました。
これで、
wep_app_start.sh
でサーバー起動、
プログラム修正して [Command + B] でビルド、
wep_app_restart.sh
でサーバー再起動、
web_app_stop.sh
でサーバー停止がショートカットでいけるようになりました。
2
[2]. 実は、Dropwizardアプリケーション を IntelliJ から起動、[Command + B]でコンパイル 、IntelliJ から再起動でもなかなかのスピードで実施できるという説もあります。
以上です。
コメント