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

Обновление статического содержимого с помощью Spring MVC и загрузки

Я оцениваю Spring MVC и Boot и AngularJs для создания веб-приложений. Я столкнулся с проблемой, что, когда я вношу изменения в свой статический контент (html, js, css), я должен перезапускать приложение каждый раз. Я надеюсь, что есть какой-то способ решить это, потому что перезагрузка всего приложения для статических изменений контента неэффективна. Каждая другая инфраструктура веб-приложения, которую я пробовал, позволяет обновлять файлы статического контента "на лету" (даже просто Spring MVC и обычное приложение WAR).

Я установил свой проект из раздела "Создание веб-службы RESTful с помощью Spring Boot Actuator" (http://spring.io/guides/gs/actuator-service/). В основном он использует Spring Boot и MVC-контроллеры для создания службы REST. Кроме того, я использовал "Использование RESTful Web Service с AngularJS" (http://spring.io/guides/gs/consuming-rest-angularjs/) для создания интерфейса с AngularJS. Он создает веб-страницу, отображающую ответ от службы REST. Единственное изменение, которое я сделал, заключается в том, что запросы выполняются для моего приложения вместо "http://rest-service.guides.spring.io/greeting". Мой статический контент хранится в папке "src/main/resources/public". Эта настройка работает правильно, за исключением того, что она не перезагружает статический контент.

4b9b3361

Ответ 1

В документах говорится, что "все современные среды IDE допускают перезагрузку статических ресурсов и, как правило, горячую замену изменений классов Java" (https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/html/howto. html # howto-hotswapping). Это правда. Eclipse делает это более или менее по умолчанию, и я не пользователь IntelliJ, но, насколько я понимаю, вы можете настроить его для автоматической сборки.

Ответ 2

А... Я тоже столкнулся с этой проблемой.

Вместо того, чтобы помещать статический контент в папку classpath src/main/resources/public, поместите их в src/main/webapp, так же, как и любое другое веб-приложение Java. Встроенный Tomcat будет автоматически перезагружать их при каждом изменении.

Как указано в комментариях, конфигурация по умолчанию не будет включать ресурсы, находящиеся в src\main\webapp. Чтобы обойти эту проблему, вы можете просто добавить следующее к вашему pom.xml <build> node:

<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>

Используя плагин ресурсов, вы можете сделать свою локальную разработку, запустив исполняемый JAR:

java -jar target/.jar

Во время запуска вы можете использовать инструменты Chrome Dev или любую другую IDE, которая вам нравится для изменения файлов, без перезапуска. Однако всякий раз, когда вы запускаете свою сборку, тогда сгенерированный пакет будет включать все файлы под src\main\webapp в src\main\resources\static.

Ответ 3

Резюме первоначальной задачи

Я столкнулся с проблемой, что, когда я вношу изменения в свой статический контент (html, js, css), я должен перезапускать приложение каждый раз

У меня была та же проблема и, наконец, она была решена, добавив

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

до spring-boot-maven-plugin в pom.xml Я смутился этой штукой spring -boot-devtools, но это не повлияло на меня.

Мой статический контент хранится в папке "src/main/resources/public".

Ваш путь в порядке. src/main/resources/static также прекрасен.

Ответ 4

Мы с коллегой столкнулись с этой проблемой. Мы нашли ответ в Документация IntelliJ...

В главном меню выберите Выполнить | Обновить измененные классы

Ответ 5

Мое решение (написано в Kotlin, но совершенно очевидно):

@Controller
class WebController : WebMvcConfigurerAdapter() {

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

Основная идея заключается в том, что вы можете добавить свой собственный обработчик ресурсов условно. Например. если установлено какое-либо системное свойство (resources.local.path), то добавьте местоположение ресурса со значением из свойства. Затем вы устанавливаете это свойство в разработке с некоторым разумным значением, например '-Dresources.local.path = file:/Users/andrey/Projects/gsp-test/src/main/resources/static/'.

Не забывайте конечную косую черту.

Ответ 6

У меня была такая же проблема, предлагаемое здесь решение кажется логичным и для меня работало вкратце: 1- ctrl + shift + A 2- поиск реестра 3- в открывшемся диалоговом поиске "compiler.automake.allow.when.app.running" и проверить его http://garywaddell.com/2015/11/20/spring-boot-intellij-idea-not-reloading-static-content/

Ответ 7

Для eclipse вы должны активировать параметр Project → "Build Automatically" в качестве минимальной конфигурации.

Ответ 8

В результате я использовал Browsersync с grunt. browsersync и grunt следит за вашими статическими ресурсами на диске и обновляет браузер при редактировании файлов. Он действует как своего рода прокси. Таким образом вы можете сразу увидеть изменения в пользовательском интерфейсе, не создавая и не перезапуская что-либо.

Grunt, browsersync, spring boot и angularjs настроены для вас, если вы используете JHipster, который я использовал для настройки моего проекта.

Конечно, для этого требуется гораздо больше инструментов, чем просто IDE, и это намного сложнее, поэтому я бы не рекомендовал это для каждого проекта.

Ответ 9

spring -boot-devtools не решение для "горячего развертывания" отредактированного статического htm/js

Я сконфигурировал веб-фасет внутри intellij, так что, когда я использую его для редактирования файла html/js внутри ресурсов /static, intellij затем знает, чтобы скопировать обновленный файл в. /target и загрузочное приложение spring, которое я запустил внутри автоматически отображает содержимое

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

Ответ 10

@eigil добавил конфигурацию addResources для сборки maven. Я использую spring-boot-gradle-plugin в сборке gradle, и я обнаружил эту проблему github Spring Boot, и в документе Spring Boot также упоминалась эта опция. Просто добавьте эту директиву в build.gradle и запустите bootRun задачу Gradle, после чего файл ресурсов bootRun сразу после сохранения. FYI.

Ответ 11

Java-версия ответа @viator:

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

Ответ 12

Я использую 1.5.8.RELEASE.

Он мгновенно обновляет мои изменения, особенно статические файлы или файлы jsp.

Если вы используете Maven. Вы должны добавить это в pom.xml

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

И вы должны запустить Spring Boot с этим:

mvn clean spring-boot:run

Полный пример и более подробно здесь https://www.surasint.com/spring-boot-with-auto-update-changed-files-example/

Ответ 13

Вы можете сделать это, просто добавив еще одну зависимость

ты Gradle

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

В тебе Pom.xml

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

Ответ 14

У вас есть две возможности, как обслуживать статический веб-контент

  1. Из пути к классам (по умолчанию src/main/resources/static или src/main/resources/public или META-INF/resources/)
  2. Из файловой системы (по умолчанию src/main/webapp)

Если вы выберете решение 1) - вы можете спокойно скопировать банку, так как внутри нее находится статический веб-контент. Если вы хотите, чтобы сервер принимал изменения, вам нужно выполнить (авто) горячую замену.

Если вы выберете решение 2) - все будет работать "из коробки", каждое изменение будет автоматически выбрано. ОДНАКО - если вы скопируете последнюю банку в другое место - все перестанет работать. Это если вы не укажете абсолютный путь в application.properties. Например:

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

Так что решение 2) проще, но менее переносимо. Решение 1) является переносимым, но более сложным в использовании (ide config).