web-dev-qa-db-ja.com

TomcatにデプロイされたSpring Boot War

AWSにデプロイしたいので、TomcatにSpring Bootアプリをデプロイしようとしています。 WARファイルを作成しましたが、Tomcatで表示されていても実行されていないようです。

詳細:
0。私のアプリは次のとおりです。

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class App {
    public static void main(String[] args) {
        SpringApplication.run(SampleController.class, args);
    }
}

@Controller
@EnableAutoConfiguration
public class SampleController {
    @RequestMapping("/help")
    @ResponseBody
    String home() {
        String input = "Hi! Please use 'tag','check' and 'close' resources.";
        return input;
    }
}

application.propertiesには次のものがあります。

server.port=${port:7777}
  1. 多くの pagesquestion-answers を読んだ後、POMに以下を追加しました。

    http://maven.Apache.org/xsd/maven-4.0.0.xsd "> 4.0.0

    <groupId>com.niewlabs</groupId>
    <artifactId>highlighter</artifactId>
    <version>1.0-SNAPSHOT</version>
    
    <packaging>war</packaging>
    
    <properties>
        <Java.version>1.8</Java.version>
    </properties>    
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.1.9.RELEASE</version>
    </parent>    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-Tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    
  2. 「mvn package」を実行して、「webapps」フォルダーに入れたWARファイル(サイズ250Mb)を取得しました。

  3. Tomcatを起動し、アプリのリストを見ることができます。私の場合は「/highlighter-1.0-SNAPSHOT」です。
  4. アプリのリンクをクリックすると、「ステータス404」ページが表示されます。
  5. Spring Bootアプリをコンテナなしで単独で実行すると、localhost:7777で実行されますが、Tomcatで実行しても何もありません。

更新:別の 参照 があります。それがどれほど有用かはわかりません。

68
Daniil Shevelev

このガイドでは、TomcatにSpring Bootアプリを展開する方法について詳しく説明します。
http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-create-a-deployable-war-file

基本的に、次のクラスを追加する必要がありました。

public class WebInitializer extends SpringBootServletInitializer {   
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(App.class);
    }    
}

また、次のプロパティをPOMに追加しました。

<properties>        
    <start-class>mypackage.App</start-class>
</properties>
100
Daniil Shevelev

ここでは、さまざまなパラダイムに混乱していると思います。まず、warファイルとサーバーの展開-これらはJava Enterprise Edition(Java EE)に属します。これらの概念は、異なるモデルに従うスプリングブートアプリケーションには実際の場所がありません。

Spring-bootは、埋め込みコンテナを作成し、標準のjarファイルから直接その内部でサービスを実行します(さらに多くのことができます)。このモデルの目的は、各サービスが独自のコンテナーを持ち、完全に自己完結型のマイクロサービス開発をサポートすることだと思います。コードを使用してJava EEアプリを生成することもできますが、(特定の種類のアプリケーション/サービスでは)スプリングブートがはるかに簡単であることを考えると、それは愚かなことです。

したがって、この情報が与えられたら、次にどのパラダイムに従うかを決定する必要があり、それに従う必要があります。

Spring-bootは実行可能です-コマンドラインから、またはお気に入りのIDEまたはmavenまたはgradleを使用して実行できるAppクラスのmainメソッドを実行する必要があります(ヒント:mavenは正しい答えです) )。これにより、Tomcatサーバー(デフォルト)が起動し、その中でサービスが利用可能になります。上記で設定したサービスは、http://localhost:7777/context/helpで利用できるはずです。contextは、共有していないコンテキスト名に置き換えることを意図しています。

戦争を作成したり、Tomcatを実行したり、何かを展開したりするつもりはありません。スプリングブートではその必要はありません。 pomのパッケージはjarではなくwarである必要があり、spring-boot-starter-Tomcatscopeは削除する必要があります-確かに提供されていません。

Mainメソッドを実行すると、コンソール出力に登録したコンテキストが表示されます。それを使用してURLを正しく取得します。

すべてを言ったが、スプリングブートは今のところ(広く採用されるまで)JEEの世界に存在しなければなりません。そのため、春の人々は、サーブレットまたはJEEコンテナにデプロイするために、実行可能なjarではなく戦争を構築するアプローチを文書化しました。これにより、戦争(または耳)以外の使用に制限がある環境で、多くのスプリングブート技術を使用できます。ただし、これは、そのような環境が非常に一般的であり、ソリューションの必要な部分、または望ましい部分であるとはみなされないという事実に対する単なる応答です。

21

ちょっとpom.xmlにこの変更を行うようにしてください

<packaging>war</packaging>

依存関係セクションで、Tomcatが提供されていることを確認してください。これにより、埋め込みTomcatプラグインが不要になります。

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-Tomcat</artifactId>
        <scope>provided</scope>
    </dependency>       

    <dependency>
        <groupId>org.Apache.Tomcat.embed</groupId>
        <artifactId>Tomcat-embed-jasper</artifactId>
        <scope>provided</scope>
    </dependency>       

これはpom.xml全体です

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.Apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <Java.version>1.8</Java.version>
        <start-class>com.example.Application</start-class>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-Tomcat</artifactId>
            <scope>provided</scope>
        </dependency>       

        <dependency>
            <groupId>org.Apache.Tomcat.embed</groupId>
            <artifactId>Tomcat-embed-jasper</artifactId>
            <scope>provided</scope>
        </dependency>       

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

Applicationクラスは次のようになります

Application.Java

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;

@SpringBootApplication
public class Application extends SpringBootServletInitializer {


    /**
     * Used when run as JAR
     */
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    /**
     * Used when run as WAR
     */
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(Application.class);
    }

}

また、MyController.Javaをテストするためのコントローラーを追加できます。

package com.example;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class MyController {

    @RequestMapping("/hi")
    public @ResponseBody String hiThere(){
        return "hello world!";
    }
}

次に、Tomcat 8バージョンでプロジェクトを実行し、次のようにコントローラーにアクセスできます。

http:// localhost:8080/demo/hi

何らかの理由でプロジェクトをTomcatに追加できない場合は、プロジェクトを右クリックして、[ビルドパス]-> [ビルドパスの構成]-> [プロジェクトフェイス]に移動します。

この3つだけが選択されていることを確認してください

動的Webモジュール3.1 Java 1.8 Javascript 1.0

17
Cesar Chavez

Gradleを使用している人々のためのソリューション

プラグインをbuild.gradleに追加します

apply plugin: 'war'

追加提供 Tomcatへの依存関係

dependencies {
    // other dependencies
    providedRuntime 'org.springframework.boot:spring-boot-starter-Tomcat'
}
4
Marcin Szymczak

Application.JavaクラスはSpringBootServletInitializerクラスを拡張する必要がありますex:

public class Application extends SpringBootServletInitializer {}
4

パブリッククラスApplicationはSpringBootServletInitializerを拡張します{}

springBootServletInitializerを拡張するだけです。 AWS/Tomcatで動作します

3
junnyea

ガイドに従った後(またはSpring Initializrを使用)、ローカルコンピューターで動作するWARがありましたが、リモートで動作しませんでした(Tomcatで実行)。

エラーメッセージはありませんでした。「Spring servlet initializerが見つかりました」というだけで、何もしませんでした。

17-Aug-2016 16:58:13.552 INFO [main] org.Apache.catalina.core.StandardEngine.startInternal Starting Servlet Engine: Apache Tomcat/8.5.4
17-Aug-2016 16:58:13.593 INFO [localhost-startStop-1] org.Apache.catalina.startup.HostConfig.deployWAR Deploying web application archive /opt/Tomcat/webapps/ROOT.war
17-Aug-2016 16:58:16.243 INFO [localhost-startStop-1] org.Apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.

そして

17-Aug-2016 16:58:16.301 INFO [localhost-startStop-1] org.Apache.catalina.core.ApplicationContext.log 2 Spring WebApplicationInitializers detected on classpath
17-Aug-2016 16:58:21.471 INFO [localhost-startStop-1] org.Apache.catalina.core.ApplicationContext.log Initializing Spring embedded WebApplicationContext
17-Aug-2016 16:58:25.133 INFO [localhost-startStop-1] org.Apache.catalina.core.ApplicationContext.log ContextListener: contextInitialized()
17-Aug-2016 16:58:25.133 INFO [localhost-startStop-1] org.Apache.catalina.core.ApplicationContext.log SessionListener: contextInitialized()

他に何も起こりませんでした。 Spring Bootは実行されませんでした。

どうやらサーバーをJava 1.8でコンパイルし、リモートコンピューターにはJava 1.7がありました。

Java 1.7でコンパイルした後、動作を開始しました。

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <Java.version>1.7</Java.version> <!-- added this line -->
    <start-class>myapp.SpringApplication</start-class>
</properties>
3
EpicPandaForce

私は同じ問題を抱えていたので、この guide に従って解決策を見つけました。私はmavenで目標を設定して実行します。

きれいなパッケージ

それは私のために働いた

3
VISHWANATH N P

Spring BootアプリケーションをAWSにデプロイすることが目標の場合、 Boxfuse を使用すると非常に簡単なソリューションが得られます。

あなたがする必要があるのは:

boxfuse run my-spring-boot-app-1.0.jar -env=prod

この意志:

  • アプリ用にカスタマイズされた最小限のOSイメージを融合します(一般的なLinuxディストリビューションの約100倍)
  • 安全なオンラインリポジトリにプッシュする
  • 約30秒でAMIに変換します
  • 新しいElastic IPまたはELBを作成して構成する
  • 新しいドメイン名を割り当てます
  • 新しいAMIに基づいて1つ以上のインスタンスを起動します

すべての画像は数秒で生成され、不変です。 VirtualBox(dev)およびAWS(test&prod)で変更せずに実行できます。

すべての更新はzero-downtime blue/green deploymentsとして実行され、1つのコマンドで自動スケーリングを有効にすることもできます。

また、Boxfuseは、Spring Bootの設定がapplication.propertiesに基づいてセキュリティグループとELBヘルスチェックを自動的に設定することも理解しています。

開始に役立つチュートリアルを次に示します。 https://boxfuse.com/getstarted/springboot

免責事項:私はBoxfuseの創設者兼CEOです

0
Axel Fontaine

Spring Boot 1.5.8.RELEASEで2018-02-03を更新します。

Pom.xmlでは、次のようにパッケージをwarに変更することにより、warプラグインをビルドするときにSpringプラグインに通知する必要があります。

<packaging>war</packaging>

また、これを追加することにより、パッケージのビルド中に埋め込みTomcatを除外する必要があります。

    <!-- to deploy as a war in Tomcat -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-Tomcat</artifactId>
        <scope>provided</scope>
    </dependency>

完全な実行可能な例はこちらにあります https://www.surasint.com/spring-boot-create-war-for-Tomcat/

0