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とかgradlepython でいうところの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 から再起動でもなかなかのスピードで実施できるという説もあります。
以上です。
コメント