Горячая замена в IntelliJ с Spring Boot и wro4j

В настоящее время я разрабатываю интерфейс/веб-приложение для встроенного сервера (упакованного в файл .jar, работающего как Tomcat) с AngularJs. На сервере есть несколько конечных точек API, которые я хочу использовать во внешнем интерфейсе.

Мой текущий подход состоит в том, чтобы использовать webjars для загрузки версии angularjs по моему выбору, а затем просто создавать приложение в папке webapp. Структура такая:

├───src
│   ├───main
│   │   ├───docker
│   │   ├───java
│   │   │   └───com
│   │   │       └───...    
│   │   ├───resources
│   │   └───webapp
│   │       └───public
│   │           ├───css
│   │           └───js
│   │               └───controllers
└───target
    ├───classes
    │   ├───com
    │   │   └───... 
    │   └───public
    │       ├───css
    │       └───js
    │           └───controllers
    ├───generated-sources
    │   └───annotations
    ├───generated-test-sources
    │   └───test-annotations
    └───test-classes
        └───com
            └───...

Файлы, которые я редактирую, находятся внутри папки src/main/webapp/public, и они «компилируются» в папку target/classes/public. Если я хочу перезагрузить файл во время работы сервера, я должен выполнить Run -> Reload Changed Classes, который работает достаточно хорошо во время разработки.

Но поскольку я изначально пришел из «автономной» разработки AngularJs, я привык к реальной перезагрузке и цепочке сборки, которая минимизирует и объединяет файлы js/css для оптимизации (ворчание, беседа).

Теперь я уже заглянул в wro4j и смог его настроить. Чего мне пока не хватает, так это горячей перезагрузки. Даже описанный выше подход больше не работает с wro4j, и поэтому единственным вариантом была перекомпиляция всего приложения, чтобы увидеть изменения внутри css/javascript или HTML. Есть ли простой способ обойти это?

Моим предпочтительным способом было бы работать с неминифицированной/неконкатенированной версией во время разработки (запуск сервера в режиме отладки) и выполнять всю цепочку сборки только при развертывании приложения (или просто запустить)

Каковы мои варианты?


person puelo    schedule 20.09.2016    source источник
comment
это сработало для меня: stackoverflow.com/ вопросы/21399586/   -  person shabby    schedule 30.03.2017


Ответы (2)


Ознакомьтесь с документацией Spring Boot DevTools по адресу http://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html

Мейвен.

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

Грейдл.

dependencies {
    compile("org.springframework.boot:spring-boot-devtools")
}

Он включает в себя встроенный сервер LiveReload. Вы должны иметь возможность обновить свое приложение из IntelliJ, просто запустив «Make Project».

person Strelok    schedule 25.09.2016
comment
Livereload Spring DevTools не обнаруживает изменения, внесенные в статический контент с помощью wro4j в IntelliJ. Кроме того, когда кеширование включено в конфигурации wro4j, оно даже не обновляет сгенерированный пакет js или css. - person Mihkel Selgal; 30.09.2016

То, что я в итоге сделал, было, возможно, излишним, но я не нашел другого подходящего решения.

Я создал Gruntfile.js (на основе генератора yoman для angularjs), чтобы иметь возможность использовать функции livereload и build-chain (concat, minify и т. д.). Благодаря этому я также смог работать с интерфейсом без необходимости запуска сервера. Единственный «грязный хак» в этом файле заключается в том, что grunt build копирует свою папку dist в папку /src/main/resources/static, чтобы она «скомпилировалась» в файл .war.

Я использовал некоторые плагины maven, чтобы иметь возможность выполнять необходимые команды во время сборки (установка npm, установка Bower, сборка grunt, очистка grunt)

<plugin>
 <groupId>com.github.eirslett</groupId>
 <artifactId>frontend-maven-plugin</artifactId>
 <version>0.0.22</version> <!-- last version supported by maven 2 -->
 <dependencies>
     <dependency>
         <groupId>org.codehaus.plexus</groupId>
         <artifactId>plexus-utils</artifactId>
         <version>2.1</version>
     </dependency>
 </dependencies>
 <configuration>
     <nodeVersion>v0.10.18</nodeVersion>
     <npmVersion>1.3.8</npmVersion>
     <workingDirectory>src/main/frontend</workingDirectory>
 </configuration>
 <executions>
     <execution>
         <id>install node and npm</id>
         <goals>
             <goal>install-node-and-npm</goal>
         </goals>
         <phase>generate-resources</phase>
     </execution>
     <execution>
         <id>npm install</id>
         <goals>
             <goal>npm</goal>
         </goals>

         <configuration>
             <arguments>install</arguments>
         </configuration>
     </execution>
     <execution>
         <id>bower install</id>
         <goals>
             <goal>bower</goal>
         </goals>

         <configuration>
             <arguments>install</arguments>
         </configuration>
     </execution>
     <execution>
         <id>npm rebuild</id>
         <goals>
             <goal>npm</goal>
         </goals>

         <configuration>
             <arguments>rebuild node-sass</arguments>
         </configuration>
     </execution>
     <execution>
         <id>grunt build</id>
         <goals>
             <goal>grunt</goal>
         </goals>

         <configuration>
             <arguments>build</arguments>
         </configuration>
     </execution>
     <execution>
         <id>npm install before clean</id>
         <goals>
             <goal>npm</goal>
         </goals>

         <phase>clean</phase>

         <configuration>
             <arguments>install</arguments>
         </configuration>
     </execution>
     <execution>
         <id>grunt clean</id>
         <goals>
             <goal>grunt</goal>
         </goals>

         <phase>clean</phase>

         <configuration>
             <arguments>clean</arguments>
         </configuration>
     </execution>
 </executions>
</plugin>

Я надеюсь, что это дает общее представление о моем подходе. Это, конечно, не идеально, особенно потому, что это немного увеличивает время сборки всего проекта.

person puelo    schedule 25.11.2016