1. Introducción
Aunque la recomendación oficial del proyecto SpringBoot es usar el paquete jar para publicar, también se puede publicar como un paquete de guerra y en contenedores web externos (como Jetty, tomcat, etc.) A continuación, discutimos cómo empaquetar un proyecto Spring Boot en un paquete de guerra.
Más referencia: "Two Ways War and Jar para lanzar el proyecto SpringBoot al servidor" .
2. Construye un proyecto Spring Boot
2.1 Crear directorio Spring Boot
Consulte "Acuerdo de Maven" para crear manualmente un directorio de proyecto. Por supuesto, definitivamente puedes usar el IDE para crear.
# 存放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
Este directorio es suficiente para lo que demostraremos.
2.2 Inicializar pom.xml
Crear pom.xml
~/Desktop/FlowerShop$ touch pom.xml
contenido en 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 Crear una clase de inicio
Crear clase de inicio MainApplicationStarter.java
~/Desktop/FlowerShop$ touch src/main/java/com/flower/MainApplicationStarter.java
~/Desktop/FlowerShop$ vim src/main/java/com/flower/MainApplicationStarter.java
Contenidos en 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 Crear controlador
Crear HomeController.java
~/Desktop/FlowerShop$ touch src/main/java/com/flower/controller/HomeController.java
~/Desktop/FlowerShop$ vim src/main/java/com/flower/controller/HomeController.java
Contenido en 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 Ejecute la prueba
~/Desktop/FlowerShop$ mvn spring-boot:run
¡El proyecto SpringBoot fue creado con éxito! Antes de ajustar el proyecto, el paquete de guerra se implementa en Jetty9 y se informará un error al comenzar:
~/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. Ajuste el proyecto SpringBoot para prepararse para el paquete de guerra
3.1 Modificar pom.xml
org.apache.juli.logging.Log: Provider org.eclipse.jetty.apache.jsp.JuliLog not a subtype
: El JuliLog proporcionado por el contenedor Jetty no es una subclase de org.apache.juli.logging.Log, que es causada por el mecanismo de carga de Jetty (el problema no se implementa directamente en tomcat) El pom.xml se modifica de la siguiente manera:
- La dependencia de Spring-boot-starter-web excluye tomcat
- Introducir dependencias spring-boot-starter-jetty
- Comenta el plugin 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 Modificar la clase de inicio
Como deseamos comenzar el proyecto con un contenedor web externo, la clase de inicio debe heredar SpringBootServletInitializer y anular el método de configuración. Si usa el contenedor web incorporado, no necesita heredar 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. Paquete de guerra a Jetty9
Pack
~/Desktop/FlowerShop$ mvn clean package
Copie el paquete FlowerShop / target / xxx.war en el directorio webapps de Jetty, reinicie Jetty, ingrese en el navegador:
¡éxito!
Nota:
El método de implementación oficialmente recomendado del proyecto SpringBoot es el modo de operación del paquete jar, es decir nohup java -jar xxx.jar &
.
Si desea utilizar la implementación del paquete jar, entonces necesita restaurar, pero no necesita restaurar todo, solo agregue nuevamente al complemento
spring-boot-maven-plugin:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
Bienvenida atención