Подтвердить что ты не робот

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.

4b9b3361

Ответ 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>