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}
多くの pages と question-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>
「mvn package」を実行して、「webapps」フォルダーに入れたWARファイル(サイズ250Mb)を取得しました。
更新:別の 参照 があります。それがどれほど有用かはわかりません。
このガイドでは、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>
ここでは、さまざまなパラダイムに混乱していると思います。まず、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-Tomcat
のscope
は削除する必要があります-確かに提供されていません。
Mainメソッドを実行すると、コンソール出力に登録したコンテキストが表示されます。それを使用してURLを正しく取得します。
すべてを言ったが、スプリングブートは今のところ(広く採用されるまで)JEEの世界に存在しなければなりません。そのため、春の人々は、サーブレットまたはJEEコンテナにデプロイするために、実行可能なjarではなく戦争を構築するアプローチを文書化しました。これにより、戦争(または耳)以外の使用に制限がある環境で、多くのスプリングブート技術を使用できます。ただし、これは、そのような環境が非常に一般的であり、ソリューションの必要な部分、または望ましい部分であるとはみなされないという事実に対する単なる応答です。
ちょっと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
プラグインをbuild.gradle
に追加します
apply plugin: 'war'
追加提供 Tomcatへの依存関係
dependencies {
// other dependencies
providedRuntime 'org.springframework.boot:spring-boot-starter-Tomcat'
}
Application.Java
クラスはSpringBootServletInitializer
クラスを拡張する必要がありますex:
public class Application extends SpringBootServletInitializer {}
パブリッククラスApplicationはSpringBootServletInitializerを拡張します{}
springBootServletInitializerを拡張するだけです。 AWS/Tomcatで動作します
ガイドに従った後(または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>
Spring BootアプリケーションをAWSにデプロイすることが目標の場合、 Boxfuse を使用すると非常に簡単なソリューションが得られます。
あなたがする必要があるのは:
boxfuse run my-spring-boot-app-1.0.jar -env=prod
この意志:
すべての画像は数秒で生成され、不変です。 VirtualBox(dev)およびAWS(test&prod)で変更せずに実行できます。
すべての更新はzero-downtime blue/green deploymentsとして実行され、1つのコマンドで自動スケーリングを有効にすることもできます。
また、Boxfuseは、Spring Bootの設定がapplication.properties
に基づいてセキュリティグループとELBヘルスチェックを自動的に設定することも理解しています。
開始に役立つチュートリアルを次に示します。 https://boxfuse.com/getstarted/springboot
免責事項:私はBoxfuseの創設者兼CEOです
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/