java - formulario - Actualización de contenido estático con Spring MVC y Boot
spring mvc formulario ejemplo (14)
@eigil mencionó addResources
config para maven build. Estoy usando spring-boot-gradle-plugin
en una compilación de gradle, y encontré este problema de Spring Boot github , y el de Spring Boot también mencionó esta opción . Simplemente agregue esta directiva a build.gradle y ejecute la tarea bootRun
, luego el archivo de recursos se actualiza inmediatamente cuando se guarda. FYI.
Estoy evaluando Spring MVC & Boot y AngularJs para crear aplicaciones web. Me he encontrado con el problema de que cuando realizo modificaciones en mi contenido estático (html, js, css), tengo que reiniciar la aplicación cada vez. Espero que haya alguna manera de resolver eso porque reiniciar toda la aplicación para cambios de contenido estático no es eficiente. Todos los demás frameworks de aplicaciones web que he probado permiten actualizar archivos de contenido estático sobre la marcha (incluso solo Spring MVC y la aplicación WAR simple).
Configuré mi proyecto en la guía "Creación de un servicio web RESTful con actuador de arranque por resorte" ( http://spring.io/guides/gs/actuator-service/ ). Básicamente usa los controladores Spring Boot y MVC para crear un servicio REST. Además, utilicé la guía "Consumir un servicio web RESTful con AngularJS" ( http://spring.io/guides/gs/consuming-rest-angularjs/ ) para construir una interfaz con AngularJS. Crea una página web que muestra la respuesta del servicio REST. El único cambio que he hecho es que las solicitudes se realizan en mi aplicación en lugar de " http://rest-service.guides.spring.io/greeting ". Mi contenido estático se almacena en la carpeta "src / main / resources / public". Esta configuración funciona correctamente, excepto que no recarga el contenido estático.
Ah ... me encontré con este problema también.
En lugar de poner su contenido estático en la carpeta classpath src/main/resources/public
, colóquelos en src/main/webapp
, de la misma manera que lo haría con cualquier otra aplicación web de Java. El Tomcat integrado los volverá a cargar automáticamente cada vez que cambien.
Como se menciona en los comentarios, la configuración predeterminada no incluirá los recursos que están en src/main/webapp
. Para solucionar este problema, puede agregar lo siguiente a su nodo pom.xml <build>
:
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>copy-resources</id>
<phase>validate</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${basedir}/target/classes/static</outputDirectory>
<resources>
<resource>
<directory>src/main/webapp</directory>
<filtering>true</filtering>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
Al usar el complemento de recursos, puede hacer su desarrollo local ejecutando el JAR ejecutable:
java -jar target / .jar
Mientras se está ejecutando, puede utilizar las herramientas de desarrollo de Chrome o cualquier IDE que desee para modificar los archivos, sin reinicios. Sin embargo, cada vez que ejecute su compilación, el paquete generado incluirá todos los archivos en src/main/webapp
en src/main/resources/static
.
Estoy usando 1.5.8.RELEASE.
Al instante actualiza mis cambios, especialmente archivos estáticos o archivos jsp.
Si estás usando Maven. Necesitas agregar esto en pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
Y tienes que iniciar Spring Boot con esto:
mvn clean spring-boot:run
Ejemplo completo y más detalles aquí https://www.surasint.com/spring-boot-with-auto-update-changed-files-example/
La versión de Java de la respuesta de @viator:
@Configuration
class WebMvcConfigurer extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/dist/*.js").addResourceLocations(
"file:src/main/typescript/dist/"
);
}
}
Lo que terminé usando fue Browsersync con gruñido . browsersync y grunt observan tus recursos estáticos en el disco y actualizan el navegador cuando editas los archivos. Actúa como una especie de proxy. De esta forma, puede ver los cambios en la IU inmediatamente sin crear o reiniciar nada.
Grunt, browsersync, spring boot y angularjs están configurados para usted si usa JHipster que utilicé para configurar mi proyecto.
De acuerdo, esto requiere muchas más herramientas que solo un IDE y es mucho más complicado, por lo que no recomendaría esto para cada proyecto.
Los documentos dicen "todos los IDEs modernos permiten la recarga de recursos estáticos y generalmente también el intercambio en caliente de cambios de clases de Java" ( http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#howto-hotswapping ). Es verdad. Eclipse lo hace más o menos de manera predeterminada, y yo no soy un usuario de IntelliJ, pero por lo que entiendo, también puede configurarlo para que se genere automáticamente.
Mi solución (escrita en Kotlin pero es bastante obvia):
@Controller
class WebController : WebMvcConfigurerAdapter() {
override fun addResourceHandlers(registry: ResourceHandlerRegistry) {
System.getProperty("resources.local.path")?.let {
registry.addResourceHandler("/**").addResourceLocations(it)
}
}
...
}
La idea principal es que puede agregar su propio manejador de recursos condicionalmente. Por ejemplo, si se establece alguna propiedad del sistema ( resources.local.path ), agregue la ubicación del recurso con el valor de la propiedad. A continuación, establezca esta propiedad en desarrollo con un valor razonable como ''-Dresources.local.path = file: / Users / andrey / Projects / gsp-test / src / main / resources / static /''.
No te olvides de la barra final.
Para eclipse, debe activar la opción Proyecto -> "Generar automáticamente" como configuración mínima.
Puedes hacerlo simplemente agregando una dependencia más
Gradle
compile group: ''org.springframework.boot'', name: ''spring-boot-devtools'', version: ''1.3.0.RELEASE''
En ti Pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>1.3.0.RELEASE</version>
</dependency>
Tienes dos possebilities para servir contenido web estático
- Desde classpath (por defecto src / main / resources / static o src / main / resources / public o META-INF / resources /)
- Desde el sistema de archivos (por defecto src / main / webapp)
Si elige la solución 1), puede copiar el contenedor de manera segura ya que el contenido web estático está dentro de ese contenedor. Si desea que el servidor capte los cambios, debe hacer (auto) hotswapping.
Si elige la solución 2), todo saldrá bien, todos los cambios se recogerán automáticamente. SIN EMBARGO, si copia el contenedor final en una ubicación diferente, las cosas dejarán de funcionar. Eso es a menos que especifique una ruta absoluta en application.properties
. Por ejemplo:
spring.resources.static-locations=file:///C:/myspringbootapp/src/main/webapp
Entonces la solución 2) es más fácil pero menos portátil. La solución 1) es portátil pero más difícil de usar (ide config).
Tuve el mismo problema, la solución propuesta aquí parece lógica y funcionó para mí en breif: 1- ctrl + shift + A 2- búsqueda de registro 3- en la búsqueda de diálogo abierto para "compiler.automake.allow.when.app. corriendo "y compruébalo http://garywaddell.com/2015/11/20/spring-boot-intellij-idea-not-reloading-static-content/
Un colega y yo nos encontramos con este problema también. Encontramos la respuesta en la documentación de IntelliJ ...
En el menú principal, elija Ejecutar | Recargar clases modificadas
Una recapitulación del problema original
Me he encontrado con el problema de que cuando realizo modificaciones en mi contenido estático (html, js, css), tengo que reiniciar la aplicación cada vez
Tuve el mismo problema y finalmente lo resolví agregando
<configuration>
<addResources>true</addResources>
</configuration>
a spring-boot-maven-plugin
en el pom.xml
Me confundí con esta cosa de primavera-boot-devtools, pero no tuvo ningún efecto en lo que hice.
Mi contenido estático se almacena en la carpeta "src / main / resources / public".
Tu camino está bien. src / main / resources / static también está bien.
spring-boot-devtools no es la solución para "implementación en caliente" de htm / js estáticos editados
Configuré una faceta web dentro de intellij para que cuando la utilizo para editar el archivo html / js dentro de resources / static, intellij sepa copiar el archivo actualizado en ./target y la aplicación de inicio de primavera que he lanzado dentro de la muestra automáticamente ese contenido
ver https://www.jetbrains.com/help/idea/2016.2/configuring-static-content-resources.html