1.はじめに
SpringBootプロジェクトの公式な推奨事項は、jarパッケージを使用して公開することですが、warパッケージとして公開して、外部のWebコンテナ(Jetty、tomcatなど)に公開することもできます。次に、Spring Bootプロジェクトをwarパッケージにパッケージ化する方法について説明します。
その他のリファレンス:「サーバーと二つの方法のJARでの戦争に公開SpringBootプロジェクト」。
2. Spring Bootプロジェクトをビルドする
2.1 Spring Boot Directoryを作成する
プロジェクトディレクトリを手動で作成するには、「Mavenの契約」を参照してください。もちろん、IDEを使用して作成することは間違いありません。
# 存放pom.xml和所有的子目录
~/Desktop$ mkdir FlowerShop
# 项目的java源代码
~/Desktop/FlowerShop$ mkdir -p src/main/java
# 创建包com.flower和com.flower.controller
~/Desktop/FlowerShop$ mkdir -p src/main/java/com/flower/controller
# 目录结构
~/Desktop/FlowerShop$ tree -L 6
.
└── src
└── main
└── java
└── com
└── flower
└── controller
このディレクトリは、これから説明するものには十分です。
2.2 pom.xmlを初期化する
pom.xmlを作成する
~/Desktop/FlowerShop$ touch pom.xml
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.flower</groupId>
<artifactId>FlowerShop</artifactId>
<version>1.0-SNAPSHOT</version>
<!--指定打包类型:pom,war,jar-->
<packaging>war</packaging>
<properties>
<java.version>1.8</java.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<!--指定打包的名称:FlowerShopDemo.war或FlowerShopDemo.jar-->
<finalName>FlowerShopDemo</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.3スタートアップクラスを作成する
MainApplicationStarter.java起動クラスを作成する
~/Desktop/FlowerShop$ touch src/main/java/com/flower/MainApplicationStarter.java
~/Desktop/FlowerShop$ vim src/main/java/com/flower/MainApplicationStarter.java
MainApplicationStarter.javaの内容
package com.flower;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
@SpringBootApplication
public class MainApplicationStarter{
public static void main(String[] args) {
SpringApplication.run(MainApplicationStarter.class, args);
}
}
2.4コントローラーの作成
HomeController.javaを作成する
~/Desktop/FlowerShop$ touch src/main/java/com/flower/controller/HomeController.java
~/Desktop/FlowerShop$ vim src/main/java/com/flower/controller/HomeController.java
HomeController.javaのコンテンツ
package com.flower.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HomeController{
@GetMapping("/home")
public String getHomePage() {
return "I Love you to come to my Flower Shop!";
}
}
2.5テストを実行する
~/Desktop/FlowerShop$ mvn spring-boot:run
SpringBootプロジェクトが正常に作成されました!プロジェクトを調整する前に、warパッケージがJetty9にデプロイされ、開始時にエラーが報告されます。
~/Documents/jetty-distribution-9.4.27.v20200227/bin$ ./jetty.sh start
...
2020-04-15 11:00:30.101:WARN:oejw.WebAppContext:main: Failed startup of context o.e.j.w.WebAppContext@a859c5{FlowerShopDemo,/FlowerShopDemo,file:///tmp/jetty-0_0_0_0-8888-FlowerShopDemo_war-_FlowerShopDemo-any-8018217352624732370.dir/webapp/,UNAVAILABLE}{/home/kyun/Documents/jetty-distribution-9.4.27.v20200227/webapps/FlowerShopDemo.war}
java.util.ServiceConfigurationError: org.apache.juli.logging.Log: Provider org.eclipse.jetty.apache.jsp.JuliLog not a subtype
at java.util.ServiceLoader.fail(ServiceLoader.java:239)
at java.util.ServiceLoader.access$300(ServiceLoader.java:185)
at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:376)
at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404)
at java.util.ServiceLoader$1.next(ServiceLoader.java:480)
at org.apache.juli.logging.LogFactory.<init>(LogFactory.java:91)
at org.apache.juli.logging.LogFactory.<clinit>(LogFactory.java:66)
at org.apache.tomcat.websocket.WsWebSocketContainer.<init>(WsWebSocketContainer.java:92)
...
3. SpringBootプロジェクトを調整してwarパッケージを準備する
3.1 pom.xmlを変更する
org.apache.juli.logging.Log: Provider org.eclipse.jetty.apache.jsp.JuliLog not a subtype
:Jettyコンテナによって提供されるJuliLogは、org.apache.juli.logging.Logのサブクラスではありません。これは、Jettyのロードメカニズムによって引き起こされます(問題はtomcatに直接デプロイされません)。pom.xmlは次のように変更されます。
- Spring-boot-starter-web依存関係はTomcatを除外します
- spring-boot-starter-jettyの依存関係を導入する
- spring-boot-maven-pluginプラグインをコメント化する
<?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.flower</groupId>
<artifactId>FlowerShop</artifactId>
<version>1.0-SNAPSHOT</version>
<!--指定打包类型pom, war, jar-->
<packaging>war</packaging>
<properties>
<java.version>1.8</java.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 移除嵌入式tomcat插件 -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 引入Jetty依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
</dependencies>
<build>
<!--指定打包的名称:FlowerShopDemo.war或FlowerShopDemo.jar-->
<finalName>FlowerShopDemo</finalName>
<plugins>
<!--<plugin>-->
<!--<groupId>org.springframework.boot</groupId>-->
<!--<artifactId>spring-boot-maven-plugin</artifactId>-->
<!--</plugin>-->
</plugins>
</build>
</project>
3.2スタートアップクラスを変更する
外部Webコンテナーでプロジェクトを開始する必要があるため、スタートアップクラスはSpringBootServletInitializerを継承し、configureメソッドをオーバーライドする必要があります。埋め込みWebコンテナを使用する場合、SpringBootServletInitializerを継承する必要はありません。
package com.flower;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
@SpringBootApplication
public class MainApplicationStarter extends SpringBootServletInitializer{
public static void main(String[] args) {
SpringApplication.run(MainApplicationStarter.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
// 注意这里要指向原先用main方法执行的Application启动类
return builder.sources(MainApplicationStarter.class);
}
}
4. Jetty9へのwarのパッケージ化
パック
~/Desktop/FlowerShop$ mvn clean package
FlowerShop / target / xxx.warパッケージをJettyのwebappsディレクトリにコピーし、Jettyを再起動して、ブラウザーで次のように入力します:
成功!
注:
SpringBootプロジェクトの公式に推奨される展開方法は、jarパッケージ操作モード、つまりnohup java -jar xxx.jar &
です。
jarパッケージのデプロイメントを使用する場合は、復元する必要がありますが、すべて復元する必要はありません
。Spring-boot-maven-pluginプラグインに追加し直すだけです。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
ようこそ注意