Spring Загрузочный проект со статическим контентом генерирует 404 при запуске jar
Недавнее сообщение в блоге (https://spring.io/blog/2013/12/19/serving-static-web-content-with-spring-boot) с помощью Spring относительно использования статического веб-контента в Spring Проектах загрузки указывает, что несколько каталогов ресурсов могут быть используется:
- /META-INF/ресурсы/
- /ресурсы/
- /статический/
- /государственный/
Это благодаря классу WebMvcAutoConfiguration, который автоматически добавляет эти каталоги в путь к классам. Все это кажется прекрасным и, похоже, работает при использовании цели spring -boot-maven-plug-in spring -boot: run, все ваше статическое содержимое работает (например:/index.html).
Когда вы упаковываете свой проект Spring Boot и разрешаете spring -boot-maven-plugin создавать расширенный JAR, а затем пытаться запустить проект с помощью java -jar my-spring-boot-project.jar
, вы обнаружите, что ваш статический контент теперь возвращает ошибку 404.
Ответы
Ответ 1
Оказывается, что Spring Boot умеет добавлять различные каталоги ресурсов в путь к классам, Maven - это не так, и вам решать эту часть. По умолчанию в ваш JAR будет включен только src/main/resources
. Если вы создаете папку с именем /static
в корне вашего проекта (как это подразумевается в сообщении блога), то она будет работать нормально, используя spring -boot: run Maven, но не один раз вы создаете JAR.
Самое простое решение - создать папку /static
внутри /src/main/resources
, а затем Maven будет включать ее в JAR. Альтернативу вы можете добавить дополнительные ресурсы в свой проект Maven:
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>static</directory>
<targetPath>static</targetPath>
</resource>
</resources>
Надеюсь, это полезно кому-то, это очевидно, когда вы отступаете и смотрите на то, как работает Maven, но он может пнуть несколько человек, используя Spring Boot, поскольку он предназначен для большей конфигурации.
Ответ 2
Я стучу головой о стену, пытаясь понять, как это сделать с помощью gradle. Любые советы?
EDIT: я получил его для работы, добавив его в свой файл build.gradle:
// Copy resources into the jar as static content, where Spring expects it.
jar.into('static') {
from('src/main/webapp')
}
Ответ 3
Я просматривал несколько страниц, чтобы понять, как обслуживать статический контент в среде загрузки Spring. В основном все советы касались размещения статических файлов в /static/resources/src/main/webapp и т.д. Мысль о совместном использовании ниже.
-
Разрешить Spring загрузку для автоматической настройки диспетчера Servlet - убедитесь, что DispatcherServletAutoConfiguration не находится в исключении для AutoConfiguration.
@EnableAutoConfiguration (исключить = { //DispatcherServletAutoConfiguration.class, })
-
Внедрение внешнего каталога для маршрутизации статического содержимого
@value ( "$ {статические-content.locations: Файл: C:/myprj/статический/" )
private String [] staticContentLocations;
3. Внесите WebMvcAutoConfiguration с помощью WebMvcConfigurerAdapter в совет Spring, чтобы не использовать местоположение ресурсов по умолчанию, но используйте то, что мы инструктируем ему. Как ниже
@Bean
public WebMvcConfigurerAdapter webMvcConfigurerAdapter()
{
return new WebMvcConfigurerAdapter()
{
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry)
{
if (!registry.hasMappingForPattern("/**"))
{
// if this is executed spring won't add default resource
// locations - add them to the staticContentLocations if
// you want to keep them
// default locations:
// WebMvcAutoConfiguration.RESOURCE_LOCATIONS
registry.addResourceHandler("/**").addResourceLocations(
staticContentLocations);
}
}
};
}
Если C:/myprj/static имеет index.html, то http://localhost:portno/index.html должен работать. Надеюсь, что это поможет.
Ответ 4
Можно рассмотреть две вещи (Spring Boot v1.5.2.RELEASE) -
1) Проверьте все классы контроллера для аннотации @EnableWebMvc, удалите
это если есть
2) Проверьте классы контроллера, для которых используется аннотация -
@RestController или @Controller.
Не смешивайте Rest API и поведение MVC в одном классе. Для MVC используйте @Controller и для REST API используйте @RestController
Doing above 2 things resolved my issue. Now my spring boot is loading static resources with out any issues.
@Controller => load index.html => loads static files.
@Controller
public class WelcomeController {
// inject via application.properties
@Value("${welcome.message:Hello}")
private String message = "Hello World";
@RequestMapping("/welcome")
public String welcome(Map<String, Object> model) {
model.put("message", this.message);
return "welcome";
}
@RequestMapping("/")
public String home(Map<String, Object> model) {
model.put("message", this.message);
return "index";
}
}
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Hello</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet/less" th:href="@{/webapp/assets/theme.siberia.less}"/>
<!-- The app logic -->
<script type="text/javascript" data-main="/webapp/app" th:src="@{/webapp/libs/require.js}"></script>
<script type="text/javascript">
require.config({
paths: { text:"/webapp/libs/text" }
});
</script>
<!-- Development only -->
<script type="text/javascript" th:src="@{/webapp/libs/less.min.js}"></script>
</head>
<body>
</body>
</html>