resource not mvc locations found example spring maven jetty spring-boot static-content

not - El proyecto Spring Boot con contenido estático genera 404 al ejecutar jar



spring resources static locations example (4)

La publicación reciente del blog ( https://spring.io/blog/2013/12/19/serving-static-web-content-with-spring-boot ) de Spring sobre el uso de contenido web estático en los proyectos de Spring Boot indica que Se pueden usar varios directorios de recursos:

  • / META-INF / recursos /
  • / recursos /
  • /estático/
  • /público/

Esto es gracias a la clase WebMvcAutoConfiguration que agrega automáticamente estos directorios al classpath. Todo parece estar bien y parece funcionar cuando se utiliza Spring-boot-maven-plugin spring-boot: ejecutar objetivo, todo su contenido estático está funcionando (por ejemplo: /index.html).

Cuando empaqueta su proyecto Spring Boot y permite que spring-boot-maven-plugin cree el JAR mejorado y luego intente ejecutar su proyecto usando java -jar my-spring-boot-project.jar , encontrará que su contenido estático ahora devuelve un error 404.


Estoy golpeando mi cabeza contra la pared tratando de descubrir cómo hacer esto con gradle. ¿Algun consejo?

EDITAR: Lo tengo que trabajar agregando esto a mi build.gradle:

// Copy resources into the jar as static content, where Spring expects it. jar.into(''static'') { from(''src/main/webapp'') }


Estuve recorriendo algunas páginas para entender cómo publicar contenido estático en el entorno de arranque de Spring. En su mayoría, todos los consejos estuvieron relacionados con la colocación de los archivos estáticos en / static / resources / src / main / webapp, etc. Pensamos en compartir a continuación.

  1. Permita que el arranque de resorte configure automáticamente Servlet de Dispatcher - Asegúrese de que DispatcherServletAutoConfiguration no se encuentre en la exclusión para Autoconfiguración.

    @EnableAutoConfiguration (exclude = {//DispatcherServletAutoConfiguration.class,})

  2. Inyecte su directorio externo para el enrutamiento de contenido estático

    @Value ("$ {static-content.locations: file: C: / myprj / static /") private String [] staticContentLocations;

3. Suprima WebMvcAutoConfiguration utilizando WebMvcConfigurerAdapter para avisar a Spring de que no use la ubicación del recurso por defecto pero use lo que le indicamos. Como abajo

@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); } } }; }

Si C: / myprj / static tiene index.html, entonces http://localhost:portno/index.html debería funcionar. Espero que ayude.


Hay dos cosas a considerar (Spring Boot v1.5.2.RELEASE) -

1) Compruebe todas las clases de Controller para la anotación @EnableWebMvc, elimínela si hay alguna

2) Verifique las clases de Controlador para las cuales se usa la anotación: @RestController o @Controller.

No mezcle el comportamiento Rest API y MVC en una clase. Para MVC use @Controller y para API REST use @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''s 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>


Resulta que mientras Spring Boot está siendo inteligente al agregar los diversos directorios de recursos a la ruta de clase, Maven no lo es y depende de usted el tratar con esa parte. Por defecto, solo src/main/resources se incluirán en su JAR. Si creas una carpeta llamada /static en la raíz de tu proyecto (como implica la publicación del blog), funcionará bien mientras usas el spring-boot: ejecuta el objetivo de Maven pero no una vez que crees un JAR.

La solución más fácil es crear su carpeta /static dentro de /src/main/resources y luego Maven la incluirá en el JAR. Alternativa, puede agregar ubicaciones de recursos adicionales a su proyecto Maven:

<resources> <resource> <directory>src/main/resources</directory> </resource> <resource> <directory>static</directory> <targetPath>static</targetPath> </resource> </resources>

Espero que esto sea útil para alguien, es obvio cuando das un paso atrás y observas cómo funciona Maven, pero podría afectar a algunas personas que usan Spring Boot, ya que está diseñado para ser prácticamente libre de configuración.