本番環境でSpring Boot実行可能jarを実行するにはどうすればよいですか?


105

Springブートの推奨される展開方法は、内部にtomcatを含む実行可能なjarファイルを使用する方法です。

それはシンプルで始まりjava -jar myapp.jarます。

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

単に呼び出すとjava -jar、ログアウトしたときにアプリケーションが停止します。

画面またはnohupで起動することもできますが、あまり洗練されていません。サーバーを再起動すると、ログインして手動でプロセスを開始する必要があります。

それで、春のブートのタスクにはすでに何かがありますか?


1
nohup / screen(ダーティメソッド)、init / systemd / upstart(適切なメソッド)

@RCはい、前述のとおり、/ etc / init.d内のカスタムスクリプトを使用した/ sbin / initで十分ですが、誰もが独自のスクリプトを作成して管理する必要があるという考えですデーモン(開始、停止、再起動、ステータス)?そのソリューションでは何かが欠けているように感じます。
Cleber Goncalves、2014

スプリングブートで何かが足りないと感じた場合(これは本当に「新鮮な」プロジェクトです)、担当チームに連絡して、進化の提案をしてください。

さて、あなたが戦争アーカイブを生成するならば、あなたはTomcatであなたのディストリビューションのバージョンを使うことができます。一方、実行可能jarアプローチを使用する場合は、独自のカスタムinitスクリプトを作成する必要があります。それがブートのレルムにあるかどうかはわかりませんが、明らかに欠落しています。これは一種の奇妙なことなので、何か見落とした場合に備えて尋ねます。それらをpingします。
Cleber Goncalves、2014

回答:


96

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

詳細については、次のリンクを参照してください。


4
また$ chmod +x /etc/init.d/yourapp、開始/停止/再起動できるようにする必要があるかもしれません
Rohith Nandakumar 2017年

jarファイルを読み取り、実行するには、常にサービスユーザーにアクセス許可を与える必要があります。また、サーバーのデフォルトのJavaとJava環境変数を構成して、機能するようにする必要があります。
micaro

これは機能しません!試してみたところ、次のエラーが表示されました:MyApp.serviceの開始に失敗しました:Unit MyApp.service not found
Martijn Hiemstra

9

Spring Bootアプリケーションを運用環境で実行する最も簡単で信頼性の高い方法は、Dockerを使用することです。複数の接続されたサービスを使用する必要がある場合は、Docker Compose、Docker Swarm、またはKubernetesを使用します。

開始するためのDockerfile公式のSpring Boot Dockerガイドの簡単な例を以下に示します。

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

3

私のSpringブートアプリケーションには2つの初期化子があります。1つは開発用、もう1つは生産用です。開発には、次のようなmainメソッドを使用します。

@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タスクを使用します。プロダクションにデプロイする場合と同様に、アセンブルタスクを使用してWARを生成し、デプロイします。

開発中に組み込みのTomcatによって提供される利点を損なうことなく、本番環境で通常のSpringアプリケーションのように実行できます。お役に立てれば。


2

本番環境では、マシンの再起動などでアプリを再度起動したい場合、/ etc / init.d /スクリプトを作成し、適切なランレベルにリンクして起動および停止するのが正しいアプローチです。これはオペレーティングシステム固有のセットアップであり、他のオプションのトンであるため、Spring Bootはこれをカバーするまで拡張しません。chroot刑務所で実行したいですか、他のソフトウェアの前に停止/開始する必要があるかなどです。


2

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

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

アプリケーションを常に実行し続けるオプションを提供できるため、EC2が再起動すると、スーパーバイザーがアプリケーションを再起動します

起動スクリプトを/etc/init.d/に置くのに比べて、Supervisorは使いやすいことがわかりました。起動スクリプトは、エラーが発生した場合、ハングするか待機状態になります。


2

Gradleを使用している場合は、これをbuild.gradleに追加するだけです

springBoot {
    executable = true
}

次に、。/ your-app.jarと入力してアプリケーションを実行できます

また、アプリをサービスとして設定するための完全なガイドはここにあります

56.1.1 init.dサービスとしてのインストール(System V)

http://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html

乾杯


実際、それはdocs.spring.io/spring-boot/docs/current/reference/html/…をbootRepackage { executable = true }参照してください。–
Philippe

2

サービスのない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

1

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


0

これは簡単で、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はあなたのための追加です。profilesアプリを起動するプロファイルを選択します。executableアプリを正しく実行できます。

mvnwプロジェクトに追加する場合、またはMaven環境がある場合。./mvnw spring-boot:runmvnwまたはmvn spring-boot:runmavenを呼び出すことができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.