使用 Spring Boot 和 wro4j 在 IntelliJ 中进行热交换
Hot swapping in IntelliJ with Spring Boot and wro4j
我目前正在开发 front-end/webapp 用于嵌入式服务器(打包在 .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 文件夹中,它们正在 "compiled" 进入 target/classes/public 文件夹。
如果我想在服务器 运行 时重新加载文件,我必须执行 Run -> Reload Changed Classes
,这在开发时工作得很好。
但是因为我最初来自 "standalone" AngularJs 开发,所以我已经习惯了真正的 livereload 和一个构建链,它缩小和连接 js/css 文件以进行优化(grunt,bower ).
现在我已经研究过 wro4j 并且能够很好地设置它。对我来说仍然缺少的一件事是热重装。甚至上述方法也不再适用于 wro4j,因此唯一的选择是重新编译整个应用程序以查看 css/javascript 或 HTML 中的更改。
有解决这个问题的简单方法吗?
我的首选方法是在开发时使用 unminified/unconcatenated 版本(运行 服务器处于调试状态)并且仅在部署应用程序时执行整个构建链(或者只是 运行)
我有哪些选择?
在 http://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html
查看 Spring Boot DevTools 文档
Maven.
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
Gradle.
dependencies {
compile("org.springframework.boot:spring-boot-devtools")
}
它包括一个内置的 LiveReload 服务器。您应该能够通过 运行 "Make Project".
从 IntelliJ 更新您的应用程序
我最后做的可能有点矫枉过正,但我没有找到任何其他合适的解决方案。
我构建了一个 Gruntfile.js(基于 angularjs 的 yeoman 生成器)以能够具有 livereload 和构建链功能(concat、minify 等)。有了这个,我还可以在前端工作,而不必启动服务器。此文件中唯一的 "dirty hack" 是 grunt build
将其 dist 文件夹复制到 /src/main/resources/static
文件夹,以便它 "compiled" 进入 .war 文件。
我使用了一些 Maven 插件以便能够在构建时执行所需的命令(npm install、bower install、grunt build、grunt clean)
<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>
我希望这能为我的方法提供一个广泛的思路。这当然不是完美的,尤其是因为它增加了整个项目的构建时间。
我目前正在开发 front-end/webapp 用于嵌入式服务器(打包在 .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 文件夹中,它们正在 "compiled" 进入 target/classes/public 文件夹。
如果我想在服务器 运行 时重新加载文件,我必须执行 Run -> Reload Changed Classes
,这在开发时工作得很好。
但是因为我最初来自 "standalone" AngularJs 开发,所以我已经习惯了真正的 livereload 和一个构建链,它缩小和连接 js/css 文件以进行优化(grunt,bower ).
现在我已经研究过 wro4j 并且能够很好地设置它。对我来说仍然缺少的一件事是热重装。甚至上述方法也不再适用于 wro4j,因此唯一的选择是重新编译整个应用程序以查看 css/javascript 或 HTML 中的更改。 有解决这个问题的简单方法吗?
我的首选方法是在开发时使用 unminified/unconcatenated 版本(运行 服务器处于调试状态)并且仅在部署应用程序时执行整个构建链(或者只是 运行)
我有哪些选择?
在 http://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html
查看 Spring Boot DevTools 文档Maven.
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
Gradle.
dependencies {
compile("org.springframework.boot:spring-boot-devtools")
}
它包括一个内置的 LiveReload 服务器。您应该能够通过 运行 "Make Project".
从 IntelliJ 更新您的应用程序我最后做的可能有点矫枉过正,但我没有找到任何其他合适的解决方案。
我构建了一个 Gruntfile.js(基于 angularjs 的 yeoman 生成器)以能够具有 livereload 和构建链功能(concat、minify 等)。有了这个,我还可以在前端工作,而不必启动服务器。此文件中唯一的 "dirty hack" 是 grunt build
将其 dist 文件夹复制到 /src/main/resources/static
文件夹,以便它 "compiled" 进入 .war 文件。
我使用了一些 Maven 插件以便能够在构建时执行所需的命令(npm install、bower install、grunt build、grunt clean)
<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>
我希望这能为我的方法提供一个广泛的思路。这当然不是完美的,尤其是因为它增加了整个项目的构建时间。