La guerra del paquete del proyecto SpringBoot se lanza a Jetty9

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

Inserte la descripción de la imagen aquí¡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:

  1. La dependencia de Spring-boot-starter-web excluye tomcat
  2. Introducir dependencias spring-boot-starter-jetty
  3. 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:
Inserte la descripción de la imagen aquí
¡é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>

Descarga de demostración

Bienvenida atención
Inserte la descripción de la imagen aquí

Publicado 381 artículos originales · elogiado 85 · 80,000 vistas +

Supongo que te gusta

Origin blog.csdn.net/weixin_40763897/article/details/105527061
Recomendado
Clasificación