web-dev-qa-db-fra.com

Actualisation du contenu statique avec Spring MVC et Boot

J'évalue Spring MVC & Boot et AngularJs pour la construction d'applications Web. J'ai rencontré le problème suivant: lorsque je modifie mon contenu statique (html, js, css), je dois redémarrer l'application à chaque fois. J'espère qu'il existe un moyen de résoudre ce problème car le redémarrage de l'application complète pour les modifications de contenu statique n'est pas efficace. Tous les autres frameworks d'applications Web que j'ai essayés permettent de mettre à jour des fichiers de contenu statiques à la volée (même juste Spring MVC et une application ancienne WAR simple).

J'ai configuré mon projet à partir du guide "Création d'un service Web RESTful avec Spring Boot Actuator" ( http://spring.io/guides/gs/actuator-service/ ). Fondamentalement, il utilise les contrôleurs Spring Boot et MVC pour créer un service REST. En outre, j'ai utilisé le guide "Consommation d'un service Web RESTful avec AngularJS" ( http://spring.io/guides/gs/consuming-rest-angularjs/ ) pour créer une interface avec AngularJS. Il crée une page Web qui affiche la réponse du service REST. Le seul changement que j'ai apporté est que les demandes sont effectuées sur mon application au lieu de " http://rest-service.guides.spring.io/greeting ". Mon contenu statique est stocké dans le dossier "src/main/resources/public". Cette configuration fonctionne correctement, sauf qu'elle ne recharge pas le contenu statique.

38
palto

Les docs disent "tous les IDE modernes permettent le rechargement de ressources statiques et généralement aussi le remplacement à chaud des modifications de classes Java" ( https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/html/ howto.html # howto-hotswapping ). C'est vrai. Eclipse le fait plus ou moins par défaut, et je ne suis pas un utilisateur d'IntelliJ, mais si je comprends bien, vous pouvez le configurer pour qu'il fonctionne automatiquement.

12
Dave Syer

Ah ... j'ai aussi rencontré ce problème.

Au lieu de placer votre contenu statique dans le dossier chemin de classe src/main/resources/public, placez-le dans src/main/webapp, comme vous le feriez avec n'importe quelle autre application Web Java. Le Tomcat intégré les rechargera automatiquement à chaque changement.

Comme mentionné dans les commentaires, la configuration par défaut n'inclura pas les ressources qui sont dans src\main\webapp. Pour résoudre ce problème, vous pouvez simplement ajouter ce qui suit à votre noeud 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>

En utilisant le plugin de ressources, vous pouvez faire votre développement local en exécutant le fichier JAR exécutable:

Java -jar cible/.jar

Pendant le fonctionnement, vous pouvez utiliser les outils de développement Chrome ou l’option IDE de votre choix pour modifier les fichiers, sans redémarrage. Cependant, chaque fois que vous exécuterez votre construction, le package généré inclura tous les fichiers sous src\main\webapp dans src\main\resources\static.

26
Steve

Un récapitulatif du problème initial

J'ai rencontré le problème suivant: lorsque je modifie mon contenu statique (html, js, css), je dois redémarrer l'application à chaque fois.

J'ai eu le même problème et finalement résolu en ajoutant

<configuration>
    <addResources>true</addResources>
</configuration>

spring-boot-maven-plugin dans le pom.xml Je me suis perdu dans cette affaire spring-boot-devtools, mais cela n’a aucun effet, quoi que je fasse.

Mon contenu statique est stocké dans le dossier "src/main/resources/public".

Votre chemin est parfait. src/main/resources/static convient également.

26
eigil

Un collègue et moi avons également rencontré ce problème. Nous avons trouvé la réponse dans la documentation IntelliJ ...

Dans le menu principal, choisissez Run | Recharger les classes modifiées

8
hyness

Ma solution (écrite en Kotlin mais est assez évidente):

@Controller
class WebController : WebMvcConfigurerAdapter() {

    override fun addResourceHandlers(registry: ResourceHandlerRegistry) {
        System.getProperty("resources.local.path")?.let {
            registry.addResourceHandler("/**").addResourceLocations(it)
        }
    }
...
}

L'idée principale est que vous pouvez ajouter votre propre gestionnaire de ressources de manière conditionnelle. Par exemple. Si une propriété système est définie (resources.local.path), ajoutez l'emplacement de la ressource avec la valeur de la propriété. Ensuite, vous définissez cette propriété en développement avec une valeur raisonnable comme '-Dresources.local.path = file:/Users/andrey/Projects/gsp-test/src/main/resources/static /'.

N'oubliez pas le slash final.

4
viator

J'ai eu le même problème, la solution proposée ici semble logique et a fonctionné pour moi in breif: 1- Ctrl + Maj + A 2- recherche de registre 3- dans la recherche de dialogue ouvert pour "compiler.automake.allow.when.app.running" et le vérifier http://garywaddell.com/2015/11/20/spring-boot-intellij-idea-not-reloading -static-content/

2
ameen

Vous pouvez le faire en ajoutant simplement une dépendance supplémentaire 

vous Gradle

compile group: 'org.springframework.boot', name: 'spring-boot-devtools', version: '1.3.0.RELEASE'

En toi Pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <version>1.3.0.RELEASE</version>
</dependency>
1
Dev Sabby

Ce que j'ai fini par utiliser était Browsersync with grunt . browsersync et grunt surveillent vos ressources statiques sur le disque et mettent à jour le navigateur lorsque vous modifiez les fichiers. Il agit comme une sorte de proxy. De cette façon, vous pouvez voir immédiatement les modifications de l'interface utilisateur sans rien construire ni redémarrer.

Grunt, browsersync, spring boot et angularjs sont configurés pour vous si vous utilisez JHipster que j'avais l'habitude de configurer mon projet.

Certes, cela nécessite beaucoup plus d’outils qu’un IDE et c’est beaucoup plus compliqué, aussi je ne le recommanderais pas pour chaque projet.

1
palto

spring-boot-devtools est not la solution pour "déployer à chaud" des htm/js statiques édités

J'ai configuré une facette Web dans intellij de telle sorte que lorsque je l'utilise pour éditer un fichier html/js dans resources/static, intellij sait ensuite copier le fichier mis à jour vers ./target et l'application de démarrage printanière que j'ai lancée dans affiche automatiquement ce contenu

voir https://www.jetbrains.com/help/idea/2016.2/configuring-static-content-resources.html

1
pbirnie

La version Java de la réponse de @viator:

@Configuration
class WebMvcConfigurer extends WebMvcConfigurerAdapter {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/dist/*.js").addResourceLocations(
            "file:src/main/TypeScript/dist/"
        );
    }
}
1
wizawu

J'utilise 1.5.8.LELEASE.

Il met à jour instantanément mes modifications, en particulier les fichiers statiques ou les fichiers jsp.

Si vous utilisez Maven. Vous devez ajouter ceci dans pom.xml 

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>

Et vous devez démarrer Spring Boot avec ceci:

mvn clean spring-boot:run

Exemple complet et détails ici https://www.surasint.com/spring-boot-with-auto-update-changed-files-example/

1
Surasin Tancharoen

Pour Eclipse, vous devez activer l'option Projet -> "Construire automatiquement" comme configuration minimale.

1
tObi

Vous avez deux possibilités comment servir un contenu Web statique

  1. À partir du chemin de classe (par défaut, src/main/resources/static Ou src/main/resources/public ou META-INF/resources /)
  2. Depuis le système de fichiers (par défaut src/main/webapp)

Si vous choisissez la solution 1), vous pouvez copier le bocal en toute sécurité, car le contenu Web statique se trouve dans ce bocal. Si vous souhaitez que le serveur prenne en compte les modifications, vous devez procéder à un échange automatique.

Si vous choisissez la solution 2) - tout fonctionnera immédiatement, chaque modification sera automatiquement prise en compte. CEPENDANT - si vous copiez le dernier pot à un autre endroit - les choses ne fonctionneront plus. C'est-à-dire sauf si vous spécifiez un chemin absolu dans application.properties. Par exemple:

spring.resources.static-locations=file:///C:/myspringbootapp/src/main/webapp

La solution 2) est donc plus facile mais moins portable. La solution 1) est portable mais plus difficile à utiliser (ide config). 

0
Holgi P