Springブートの望ましい展開方法は、Tomcatを内部に含む実行可能jarファイルを介したものです。
簡単なJava -jar myapp.jar
で始まります。
ここで、そのjarをEC2上のLinuxサーバーにデプロイしたいのですが、何か不足しているのですか、それともデーモンとしてアプリケーションを適切に起動するためにinitスクリプトを本当に作成する必要がありますか?
Java -jar
を単に呼び出すと、ログアウト時にアプリケーションが終了します。
画面またはNohupで起動することはできますが、あまりエレガントではなく、サーバーを再起動すると、ログインしてプロセスを手動で開始する必要があります。
それで、春のブーツの仕事のためにすでに何かがありますか?
Spring Boot 1.3.0.M1以降、MavenおよびGradleを使用して完全に実行可能なjarをビルドできることに注意してください。
Mavenの場合は、次のコードをpom.xml
に含めるだけです。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
</configuration>
</plugin>
Gradleの場合、次のスニペットをbuild.gradle
に追加します。
springBoot {
executable = true
}
完全に実行可能なjarには、ファイルの先頭に追加のスクリプトが含まれています。これにより、Spring Boot jarをinit.d
にシンボリックリンクするか、systemd
スクリプトを使用できます。
init.d
の例:
$ln -s /var/yourapp/yourapp.jar /etc/init.d/yourapp
これにより、次のようにアプリケーションを起動、停止、および再起動できます。
$/etc/init.d/yourapp start|stop|restart
または、systemd
スクリプトを使用します。
[Unit]
Description=yourapp
After=syslog.target
[Service]
ExecStart=/var/yourapp/yourapp.jar
User=yourapp
WorkingDirectory=/var/yourapp
SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
詳細については、次のリンクをご覧ください。
実稼働環境でSpring Bootアプリケーションを実行する最も簡単で信頼性の高い方法は、Dockerを使用することです。複数の接続されたサービスを使用する必要がある場合は、Docker Compose、Docker Swarm、またはKubernetesを使用します。
公式の Spring Boot Dockerガイド から簡単なDockerfile
を紹介します:
FROM frolvlad/Alpine-oraclejdk8:slim
VOLUME /tmp
ADD YOUR-APP-NAME.jar app.jar
RUN sh -c 'touch /app.jar'
ENV Java_OPTS=""
ENTRYPOINT [ "sh", "-c", "Java $Java_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
コンテナーをデーモンとして実行するコマンドラインの例を次に示します。
docker run \
-d --restart=always \
-e "SPRING_PROFILES_ACTIVE=prod" \
-p 8080:8080 \
prefix/imagename
私のSpringブートアプリケーションには2つのイニシャライザがあります。 1つは開発用、もう1つは本番用です。開発では、次のようなメインメソッドを使用します。
@SpringBootApplication
public class MyAppInitializer {
public static void main(String[] args) {
SpringApplication.run(MyAppInitializer .class, args);
}
}
実稼働環境用の私のイニシャライザーはSpringBootServletInitializerを拡張し、次のようになります。
@SpringBootApplication
public class MyAppInitializerServlet extends SpringBootServletInitializer{
private static final Logger log = Logger
.getLogger(SpringBootServletInitializer.class);
@Override
protected SpringApplicationBuilder configure(
SpringApplicationBuilder builder) {
log.trace("Initializing the application");
return builder.sources(MyAppInitializerServlet .class);
}
}
私はgradleを使用し、build.gradleファイルは 'WAR'プラグインを適用します。開発環境で実行するときは、bootrun taskを使用します。実稼働環境にデプロイする場合と同様に、WARを生成してデプロイするためにassembleタスクを使用します。
開発中に組み込みのTomcatが提供する利点を割り引くことなく、本番環境で通常のSpringアプリケーションのように実行できます。お役に立てれば。
Supervisor というアプリケーションを使用できます。スーパーバイザ構成では、複数のサービスと同じ実行方法を定義できます。
JavaおよびSpringブートアプリケーションの場合、コマンドはJava -jar springbootapp.jar
になります。
アプリケーションを常に実行し続けるためのオプションを提供できます。したがって、EC2が再起動すると、Supervisorがアプリケーションを再起動します。
スーパーバイザーは、起動スクリプトを/etc/init.d/に置くよりも使いやすいことがわかりました。エラーが発生すると、起動スクリプトがハングするか、待機状態になります。
実稼働環境では、マシンの再起動などでアプリを再度起動する必要があります。/etc/init.d/スクリプトを作成し、適切なランレベルにリンクして起動と停止を行うのが正しい方法です。これはオペレーティングシステム固有のセットアップであり、他のオプションがたくさんあるため、Spring Bootはこれに対応しません。chrootjailで実行したい、他のソフトウェアの前に停止/起動する必要があるなど.
サービスなしのWindows OS。
start.bat
@ECHO OFF
call run.bat start
stop.bat:
@ECHO OFF
call run.bat stop
run.bat
@ECHO OFF
IF "%1"=="start" (
ECHO start myapp
start "myapp" Java -jar -Dspring.profiles.active=staging myapp.jar
) ELSE IF "%1"=="stop" (
ECHO stop myapp
TASKKILL /FI "WINDOWTITLE eq myapp"
) ELSE (
ECHO please, use "run.bat start" or "run.bat stop"
)
pause
Gradleを使用している場合は、これをbuild.gradleに追加するだけです。
springBoot {
executable = true
}
その後、./your-app.jarと入力してアプリケーションを実行できます
また、ここでアプリをサービスとして設定するための完全なガイドを見つけることができます
56.1.1 init.dサービスとしてのインストール(システムV)
http://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html
乾杯
画面-dmS NAME/path/to/scriptを使用して、永続的または少なくとも半永続的に実行するアプリケーションを起動します。私が知る限り、これは最もエレガントなソリューションです。
これは簡単で、Spring Boot Mavenプラグインを使用してコードのデプロイを完了できます。
次のようなプラグイン構成:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<jvmArguments>-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=${debug.port}
</jvmArguments>
<profiles>
<profile>test</profile>
</profiles>
<executable>true</executable>
</configuration>
</plugin>
そして、jvmArtuments
はjvmに追加されます。 profiles
は、アプリを起動するプロファイルを選択します。 executable
を使用すると、アプリを適切に実行できます。
プロジェクトにmvnw
を追加した場合、またはMaven環境がある場合。 mvnwの場合はcall./mvnw spring-boot:run
、mavenの場合はmvn spring-boot:run
を呼び出すだけです。