web-dev-qa-db-ja.com

実稼働環境でスプリングブート実行可能jarを実行するにはどうすればよいですか?

Springブートの望ましい展開方法は、Tomcatを内部に含む実行可能jarファイルを介したものです。

簡単なJava -jar myapp.jarで始まります。

ここで、そのjarをEC2上のLinuxサーバーにデプロイしたいのですが、何か不足しているのですか、それともデーモンとしてアプリケーションを適切に起動するためにinitスクリプトを本当に作成する必要がありますか?

Java -jarを単に呼び出すと、ログアウト時にアプリケーションが終了します。

画面またはNohupで起動することはできますが、あまりエレガントではなく、サーバーを再起動すると、ログインしてプロセスを手動で開始する必要があります。

それで、春のブーツの仕事のためにすでに何かがありますか?

88

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

詳細については、次のリンクをご覧ください。

81
corleone

実稼働環境で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
6
mrts

私の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アプリケーションのように実行できます。お役に立てれば。

3
O-OF-N

Supervisor というアプリケーションを使用できます。スーパーバイザ構成では、複数のサービスと同じ実行方法を定義できます。

JavaおよびSpringブートアプリケーションの場合、コマンドはJava -jar springbootapp.jarになります。

アプリケーションを常に実行し続けるためのオプションを提供できます。したがって、EC2が再起動すると、Supervisorがアプリケーションを再起動します。

スーパーバイザーは、起動スクリプトを/etc/init.d/に置くよりも使いやすいことがわかりました。エラーが発生すると、起動スクリプトがハングするか、待機状態になります。

2
unnik

実稼働環境では、マシンの再起動などでアプリを再度起動する必要があります。/etc/init.d/スクリプトを作成し、適切なランレベルにリンクして起動と停止を行うのが正しい方法です。これはオペレーティングシステム固有のセットアップであり、他のオプションがたくさんあるため、Spring Bootはこれに対応しません。chrootjailで実行したい、他のソフトウェアの前に停止/起動する必要があるなど.

2
spstorey

サービスなしの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
2
sgrillon

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

乾杯

2
isijara

画面-dmS NAME/path/to/scriptを使用して、永続的または少なくとも半永続的に実行するアプリケーションを起動します。私が知る限り、これは最もエレガントなソリューションです。

1
Scrayos

これは簡単で、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を呼び出すだけです。

0
BeeNoisy