Я создал приложение 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.
Что вы развернули на tomcat? Созданный файл jar или вы изменили, чтобы создать файл войны?
Я предполагаю, что вы получаете файл projecto.war, который вы развертываете как есть (а не как ROOT), и у вас есть конечная точка /projeto - по умолчанию tomcat добавит контекстный путь в качестве имени файла войны (но не встроенный в spring boot), поэтому я предполагаю, что правильный путь http://localhost:8080/projeto/projeto
@AjayKumar, у меня его нет, он просто не работает на сервере tomcat, и я не могу заставить его создавать журналы.
я развернул военный файл, созданный с помощью пакета mvn @khmarbaise
@grekier спасибо за предложение, но я попробовал «localhost: 8080/projeto/projeto» и получил ту же ошибку 404. Кроме того, я развернул проект, который во многом ОЧЕНЬ похож на этот (основное отличие была версия весенней загрузки 2.7.3 вместо 3.0.0 и tomcat 9.0.65 вместо 10.1.7), и она работала с тем же контекстным путем, что и в среде IDE.
1. почему/зачем у вас есть tomcat-embed-jasper
как зависимость? (2. maria/mysql неоднозначно) 3. что говорит catalina.out/logs: какой-нибудь «баннер весенней загрузки» в поле зрения?
@ xerx593 1. я добавил «tomcat-embed-jasper» в качестве зависимости, потому что по какой-то причине я не могу понять, когда у меня его нет, я получаю сообщение об ошибке, говорящее о том, что filterChain требуется bean-компонент HttpSecurity, который не может быть найден. Добавление «tomcat-embed-jasper» устраняет ошибку, но я не знаю, как это сделать. 2. Раньше я использовал эти зависимости в сочетании с другими версиями весенней загрузки, и это сработало. 3. баннера не видно, он только говорит, что запустил сервлет и развернул приложение в /projeto в консоли после запуска startup.bat. Я не могу заставить его создавать журналы. Я чувствую, что это проблема совместимости с версиями
Спасибо! (рассмотрите (заранее/дополнительно к комментированию) отредактировать свой пост, чтобы добавить соответствующую информацию) 1. странный/вонючий, пожалуйста, также расследуйте/отследите. (на данный момент можно жить с 2.;) 3. расстраивает и должен быть изучен/исправлен в приоритетном порядке. .. попробуйте развернуть как можно более простое приложение на tomcat (которое также работает в ide) .. начните с spring-starter#type=war
Попробуйте это: localhost: 8080/Projeto Capital P
@AjayKumar пробовал с большой буквы P, но безуспешно. Спасибо за предложение
Как развертывается в Tomcat?
@grekier я извлек военный файл (который содержит папки WEB-INF, org и META-INF) в папку с именем projeto внутри папки webapps tomcat. Таким образом, приложение находится внутри папки projeto, которая находится внутри папки webapps в папке tomcat.
Тогда все ваши конечные точки должны иметь контекстный путь /projeto
в дополнение к определению конечной точки в вашем проекте. Можете ли вы показать код RestController?
@grekier Да, и они это делают. Но у меня есть конечная точка "/", доступная по адресу "localhost:8080/projeto". У меня также есть это: «server.servlet.context-path=/projeto» в моих application.properties, чтобы все конечные точки имели контекстный путь /projeto.
Зафиксированный.
Было 2 вещи, которые мне нужно было изменить, чтобы заставить его работать. Сначала мне пришлось добавить к основному классу «extends SpringBootServletInitializer» и переопределить метод настройки, оба из них я думал, что сделал, но, по-видимому, полностью забыл.
Даже после внесения этих изменений он все еще не работал, но после изменения версии tomcat с 10.1.7 на 10.0.2 он почему-то заработал. Я все еще думаю, что 10.1.7 должна быть совместима. Но, по крайней мере, сейчас он работает.
Спасибо всем, кто помог.
Поделитесь полной трассировкой ошибки.