Spring Boot 3 работает на встроенном Tomcat, но не на внешнем Tomcat

Я создал приложение spring boot 3.0.0, и когда я запускаю его в своей среде IDE (intelliJ), оно отлично работает, но когда я пытаюсь развернуть его на внешнем коте (версия tomcat 10.1.7), оно не работает.

Когда я запускаю его в своей среде IDE и получаю доступ к localhost:8080/projeto, он показывает мне страницу, которую он должен отображать, и я могу перейти оттуда на другие страницы и делать то, для чего предназначено веб-приложение. Но когда я получаю доступ к localhost: 8080/projeto после запуска внешнего кота, у которого есть мое приложение в папке с именем «projeto» внутри папки веб-приложений, я получаю сообщение об ошибке:

«Статус HTTP 404 — не найден. Введите отчет о состоянии. Сообщение Запрошенный ресурс [/projeto/] недоступен Описание Исходный сервер не нашел текущего представления целевого ресурса или не желает раскрывать его существование. Апач Томкэт/10.1.7"

в обоих случаях используется версия java 19.0.1.

Это мой 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<packaging>war</packaging>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.0.0</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>TestSecurity</groupId>
<artifactId>Projeto</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Projeto</name>
<description>Demo project for Spring Boot</description>

<properties>
    <java.version>17</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
        <groupId>jakarta.persistence</groupId>
        <artifactId>jakarta.persistence-api</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
        <groupId>org.mariadb.jdbc</groupId>
        <artifactId>mariadb-java-client</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>jakarta.servlet</groupId>
        <artifactId>jakarta.servlet-api</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
    </dependency>
</dependencies>

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

</project>

Я пытался изменить версию tomcat на разные версии, но я чувствую, что версия 10.1.7 должна работать с этим веб-приложением, хотя до сих пор мне это не удалось.

Обновлено: Я добавил эту зависимость в pom.xml:

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

и создал этот файл logback.xml в папке ресурсов:

<configuration>
<appender name = "FILE" class = "ch.qos.logback.core.FileAppender">
    <file>${catalina.base}/logs/projetologs.log</file>
    <encoder>
        <pattern>%d [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>
</appender>
<root level = "INFO">
    <appender-ref ref = "FILE" />
</root>
</configuration>

Я сделал это, пытаясь получить журналы ошибок и выяснить, что происходит, но файл projetologs.log, созданный в папке журналов в tomcat, создается пустым, и после попытки запустить приложение и доступа к локальному хосту: 8080 записи не добавляются. /проект

Это контроллер для "/":

    import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class HomeController {

    @GetMapping(value = "/")
    public ModelAndView homePage() {
        ModelAndView mav = new ModelAndView("index");

        if (SecurityContextHolder.getContext().getAuthentication().getPrincipal() != "anonymousUser") {

            User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();

            mav.addObject("username", user.getUsername());
        }

        return mav;
    }

}

У меня также есть эта строка в моем application.properties, чтобы установить путь контекста приложения к /projeto

server.servlet.context-path=/projeto

следуя предложению @ xerx593, я сделал минимальное приложение, которое имело те же версии Java, spring boot и tomcat, и когда я попытался развернуть его на tomcat, я получил ту же ошибку 404.

Минимальное приложение — это буквально только этот контроллер:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    @GetMapping ("/")
    public String home(){
        return "HOME page";
    }

    @GetMapping ("/admin")
    public String admin(){
        return "ADMIN page";
    }

    @GetMapping ("/user")
    public String user(){
        return "USER page";
    }
}

этот пом.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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

<packaging>war</packaging>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.0.0</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>groupz</groupId>
<artifactId>artifactz</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>namez</name>
<description>Demo project for Spring Boot</description>
<properties>
    <java.version>19</java.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

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

и это приложение.Свойства:

server.servlet.context-path=/artifactz

Кажется, что то, что является причиной ошибки для большего приложения, также происходит здесь с этим минимальным приложением. Вероятно, несовместимость версии, но предполагается, что spring boot 3+ совместим с tomcat 10.1.7.

Поделитесь полной трассировкой ошибки.

Ajay Kumar 20.04.2023 18:56

Что вы развернули на tomcat? Созданный файл jar или вы изменили, чтобы создать файл войны?

khmarbaise 20.04.2023 19:17

Я предполагаю, что вы получаете файл projecto.war, который вы развертываете как есть (а не как ROOT), и у вас есть конечная точка /projeto - по умолчанию tomcat добавит контекстный путь в качестве имени файла войны (но не встроенный в spring boot), поэтому я предполагаю, что правильный путь http://localhost:8080/projeto/projeto

grekier 20.04.2023 20:49

@AjayKumar, у меня его нет, он просто не работает на сервере tomcat, и я не могу заставить его создавать журналы.

Joao Branco 21.04.2023 11:01

я развернул военный файл, созданный с помощью пакета mvn @khmarbaise

Joao Branco 21.04.2023 11:02

@grekier спасибо за предложение, но я попробовал «localhost: 8080/projeto/projeto» и получил ту же ошибку 404. Кроме того, я развернул проект, который во многом ОЧЕНЬ похож на этот (основное отличие была версия весенней загрузки 2.7.3 вместо 3.0.0 и tomcat 9.0.65 вместо 10.1.7), и она работала с тем же контекстным путем, что и в среде IDE.

Joao Branco 21.04.2023 11:07

1. почему/зачем у вас есть tomcat-embed-jasper как зависимость? (2. maria/mysql неоднозначно) 3. что говорит catalina.out/logs: какой-нибудь «баннер весенней загрузки» в поле зрения?

xerx593 21.04.2023 16:32

@ xerx593 1. я добавил «tomcat-embed-jasper» в качестве зависимости, потому что по какой-то причине я не могу понять, когда у меня его нет, я получаю сообщение об ошибке, говорящее о том, что filterChain требуется bean-компонент HttpSecurity, который не может быть найден. Добавление «tomcat-embed-jasper» устраняет ошибку, но я не знаю, как это сделать. 2. Раньше я использовал эти зависимости в сочетании с другими версиями весенней загрузки, и это сработало. 3. баннера не видно, он только говорит, что запустил сервлет и развернул приложение в /projeto в консоли после запуска startup.bat. Я не могу заставить его создавать журналы. Я чувствую, что это проблема совместимости с версиями

Joao Branco 21.04.2023 16:53

Спасибо! (рассмотрите (заранее/дополнительно к комментированию) отредактировать свой пост, чтобы добавить соответствующую информацию) 1. странный/вонючий, пожалуйста, также расследуйте/отследите. (на данный момент можно жить с 2.;) 3. расстраивает и должен быть изучен/исправлен в приоритетном порядке. .. попробуйте развернуть как можно более простое приложение на tomcat (которое также работает в ide) .. начните с spring-starter#type=war

xerx593 21.04.2023 17:01

Попробуйте это: localhost: 8080/Projeto Capital P

Ajay Kumar 21.04.2023 19:52

@AjayKumar пробовал с большой буквы P, но безуспешно. Спасибо за предложение

Joao Branco 21.04.2023 20:24

Как развертывается в Tomcat?

grekier 21.04.2023 22:35

@grekier я извлек военный файл (который содержит папки WEB-INF, org и META-INF) в папку с именем projeto внутри папки webapps tomcat. Таким образом, приложение находится внутри папки projeto, которая находится внутри папки webapps в папке tomcat.

Joao Branco 23.04.2023 00:54

Тогда все ваши конечные точки должны иметь контекстный путь /projeto в дополнение к определению конечной точки в вашем проекте. Можете ли вы показать код RestController?

grekier 24.04.2023 10:34

@grekier Да, и они это делают. Но у меня есть конечная точка "/", доступная по адресу "localhost:8080/projeto". У меня также есть это: «server.servlet.context-path=/projeto» в моих application.properties, чтобы все конечные точки имели контекстный путь /projeto.

Joao Branco 26.04.2023 12:51
0
15
290
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Зафиксированный.

Было 2 вещи, которые мне нужно было изменить, чтобы заставить его работать. Сначала мне пришлось добавить к основному классу «extends SpringBootServletInitializer» и переопределить метод настройки, оба из них я думал, что сделал, но, по-видимому, полностью забыл.

Даже после внесения этих изменений он все еще не работал, но после изменения версии tomcat с 10.1.7 на 10.0.2 он почему-то заработал. Я все еще думаю, что 10.1.7 должна быть совместима. Но, по крайней мере, сейчас он работает.

Спасибо всем, кто помог.

Другие вопросы по теме