it-roy-ru.com

Горячая замена в Spring Boot

Я делал P.O.C с Spring Boot. 

Пока что все идет хорошо и многообещающе, но есть один существенный недостаток: я использую встроенный сервер (т. Е. Упаковываю веб-приложение в .jar), поэтому при разработке мне приходится каждый раз перестраивать jar и перезагружать сервер. Я изменяю файлы CSS, HTML или JS. Там нет горячей замены. Это действительно замедляет разработку пользовательского интерфейса. 

Я могу вспомнить несколько быстрых исправлений, таких как загрузка статических ресурсов из другого домена и обслуживание его из локальной nginx, и некоторые другие варианты, подобные этой, но разве нет какой-то встроенной опции при работе с IntelliJ/Затмение? 

33
Amnon

Есть несколько вариантов. Выполнение в IDE (особенно при включенной отладке) - хороший способ разработки (все современные среды IDE допускают перезагрузку статических ресурсов и, как правило, также горячую замену изменений класса Java). Spring Boot devtools - это дешевый способ получить достаточно мощный импульс (просто добавьте его в свой путь к классам). Он работает путем перезапуска приложения в горячей JVM при обнаружении изменений. Он также отключает такие вещи, как кэши тимелистного листа во время работы, поэтому вам не нужно помнить, чтобы сделать это самостоятельно. Вы можете использовать его с внешним процессом компилятора css/js, если вы пишете этот код с помощью инструментов более высокого уровня.

Spring Loaded больше не рекомендуется, но, вероятно, все еще используется. Более сложные инструменты на основе агентов работают намного лучше, если вам нужна горячая замена с нулевой задержкой (например, JRebel).

См. документы для некоторых обновленного содержания

22
Dave Syer

Вы можете получить горячую замену:

  • для кода Java: использование подпружиненный
  • для шаблонов Thymeleaf: отключение кеша

Проверьте этот пост, чтобы увидеть больше деталей: http://blog.netgloo.com/2014/05/21/hot-swapping-in-spring-boot-with-Eclipse-sts/

7
Fred K

нет ничего общего с IntelliJ/Eclipse?

В IntelliJ 15.0, windows 10, мне помогла следующая последовательность действий:

ШАГ 1: Добавлена ​​следующая зависимость в pom (это упоминается повсеместно, но только этот вопрос решает ее), как упомянуто @jonashackt

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

ШАГ 2: Затем из File-> Settings-> Build-Execution-Deployment -> Compiler (доказано, что выбран основной параметр компилятора, а не какой- либо из его суб-опции)

включить Make Project автоматически. Нажмите ок и закройте диалог

ШАГ 3: УдерживатьShift+Ctrl+A(на окнах) вы увидите диалоговое окно поиска с заголовком. Дважды щелкните первый вариант с надписью "Registry ...", откроется другое окно. Ищите следующую опцию:

compiler.automake.allow.when.app.running

и включите его, нажмите кнопку Закрыть

ШАГ 4: Перезапустить IDE

Разработано из этого источник

6
shabby

В Intellij я могу получить это поведение. Когда программа работает в режиме отладки, выберите Run > Reload Changed Classes

Примечание: после того, как Intellij завершит действие, он может сказать Loaded classes are up to date. Nothing to reload. Это вводит в заблуждение, потому что фактически DID перезагружает ваши ресурсы пути к классам.

Моя среда/настройка включает в себя:
Интеллиг 13
Встроенный Tomcat
Запуск/отладка конфигурации типа «Приложение» (которая использует только основной класс)
Обслуживание статических html, css и js (без jsp) 

5
dgtc

Предполагая, что вы используете Gradle; используйте следующий конфиг в вашем build.gradle

apply plugin: 'Java'
apply plugin: 'idea'
apply plugin: 'spring-boot'
apply plugin: 'application'

applicationDefaultJvmArgs = ["-agentlib:jdwp=transport=dt_socket,address=localhost:7000,server=y,suspend=n"]

mainClassName = "package.ApplicationRunner"

Запустите приложение из IDE или командной строки, используя команду gradle build run

Теперь IDE можно подключиться к удаленной JVM (на порту 7000), где запускается приложение весенней загрузки. Он также поддерживает горячее развертывание статических файлов.

или даже вы можете запустить основной класс из intelliJ, если в IDE правильно управляются зависимости. Основной класс - это класс, который содержит метод main, который будет вызывать SpringApplication.run("classpath:/applicationContext.xml", args); 

5
astronauthere

Вы также можете использовать JRebel - он перезагрузит все изменения (лучше горячую замену), включая весенние бобы. Он легко интегрируется как с Intellij, так и с Eclipse.

5
Jakub Kubrynski

Я не знаю, насколько далеко заходит такая поддержка, но в случае, если вы используете Eclipse IDE (или кто-либо, читающий это): запуск приложения Spring-Boot через m2e в режиме отладки (нажмите кнопку «Отладка» - кнопка выбора и выберите ваш пункт конфигурации maven run).

Это работает для меня как шарм.

Мой элемент конфигурации запуска maven настроен следующим образом:

  • цель установлена ​​в "весенний ботинок: беги"
  • базовый каталог - это каталог проекта

Я не использую любые другие библиотеки (даже не spring-boot-devtools).

Вот и все.

3
Igor

Я рекомендую Thymeleaf (шаблонизатор), jRebel для личного разработчика . Файлы шаблонов Thymeleaf - это просто HTML-ресурсы. Таким образом, они изменяются сразу после редактирования файлов шаблонов.

2
Jason Im

попробуйте использовать этот тег spring-boot-devtools в pom.xml

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>
 </dependencies>
1
vipul gulhane

С 1.3.0. (теперь в Milestone 2), вы можете использовать spring-boot-devtools для этого в качестве подхода lightweigt - см. docs или this blogpost . Просто обновите до> = 1.3.0 , и добавьте следующее в ваш pom.xml:

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

Затем запустите приложение SpringBoot с помощью Run As ... и все в порядке.

1
jonashackt

Если вы используете maven, то для получения горячей замены в вашем pom.xml должен быть следующий Spring-boot-maven-plugin:

  <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>springloaded</artifactId>
                <version>1.2.0.RELEASE</version>
            </dependency>
        </dependencies>
    </plugin>

и если вы используете thymeleaf, добавьте это в свойства вашего приложения:

spring.thymeleaf.cache=false

Но помните кое-что: не используйте это в своей производственной среде.

0
Rafael Lima

Как выполнить горячую замену в приложении Springboot

  1. При использовании gradle включите в зависимость следующее: compile group: 'org.springframework.boot', name: 'spring-boot-devtools', version: '2.0.1.RELEASE' & providedRuntime('org.springframework.boot:spring-boot-starter-Tomcat')

  2. Вapplication.propertiesдобавить свойство spring.devtools.restart.additional-paths=.

  3. Постройте Gradle, а затем запустите приложение как bootRun.

Приложение готово выполнить горячую замену на модификацию классов

0
Amey