19.1 从IDE中启动SpringBoot
你能从你的IDE中,将一个SpringBoot应用作为一个简单的java应用启动。然而,首先你要导入你的项目。导入步骤将会非常依赖你的IDE和构建系统。大多数的IDE能直接导入MAVEN项目,比如Eclipse能从你的File菜单选择 Import... -> Existing Maven Projects 。
如果你不能直接导入你的项目到IDE中,你也许能够构建插件生成IDE元数据。Maven包含了Eclipse和IDEA的插件。
注意:如果你偶然运行了一个web应用两次,你将会看到“Port alread in use”错误。STS用户能使用Relaunch按钮来代替Run,确认你存在的web实例已经关闭。
19.2 从打包应用来启动SpringBoot
如果你使用SpringBoot Maven 或者 Gradle插件来创建一个可执行的jar,你能使用java -jar命令来启动你的应用。比如:
$ java -jar target/myproject-0.0.1-SNAPSHOT.jar
也可以运行打包的应用程序,启动远程调试支持。这允许你将debugger程序附加到打包的应用程序中:
$ java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n -jar target/myproject-0.0.1-SNAPSHOT.jar
19.3 从MAVEN插件来运行SpringBoot
SpringBoot的MAVEN插件包含一个快速编译和快速运行的run命令。像在IDE中运行开放式应用程序一样。
$ mvn spring-boot:run
你也可以使用可用的操作系统环境变量
$ export MAVEN_OPTS=-Xmx1024m
19.4 从Gradle插件来运行SpringBoot
SpringBoot的Gradle插件也包含了运行你的开放式结构应用的bootRun命令。每当运行org.springframework.boot和java插件,都会添加bootRun任务。
$ gradle bootRun
你也可以使用可用的操作系统环境变量
$ export JAVA_OPTS=-Xmx1024m
19.5 使用Hot swapping来运行你的SpringBoot
当SpringBoot应用只是一个JAVA的应用程序。JVM hot swapping应该是开箱即用的。JVM hot swapping 在可替代字节码方面有些限制,为了更完整的解决方案可以使用JRebel(一种正对java的热部署技术)。spring-boot-devtools模块也支持应用快速重启。
20 开发工具
SpringBoot包含一组额外的开发工具,能提供愉快的开发经验。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")
}
注意:开发工具(Developer tools)在你运行完整打包项目的时候是会自动禁止的。如果你的应用是用java -jar启动,或者使用特殊的classloader启动,会被springboot认为是一个“生产应用”。标记依赖防止使用您的项目将devtools是可选的是最好的尝试。Gradle不支持可选依赖,所以你应该同时查看propdeps-plugin
注意:默认重新归档打包不包含devtools。如果你想使用某些远程功能,你将会需要禁用excludeDevtools属性,才能包含devtools。这个属性同时支持Maven和Gradle
20.1 默认属性值
通过SpringBoot支持的一些包,使用缓存来提高性能。比如,模板引擎会缓存编译好的模板来避免重新解析模板文件。还有,当请求静态资源,Spring MVC能添加http的缓存头来响应。
缓存在生产中非常有益,在开发过程中可能会造成反效果,阻止你看到在应用中刚刚作出的更改。因为这个原因,spring-boot-devtools默认是禁用缓存选项。
缓存选项通常在application.properties文件中配置。比如,在Thymeleaf提供的spring.thymeleaf.cache属性。对比需要手动设置值,spring-boot-devtools模块将会自动应用明智的开发环境配置。
注意:完整的属性列表在DevToolsPropertyDefaultsPostProcessor中查看
20.2 自动重启
应用使用spring-boot-devtools将会自动重启,当文件在classpath中发生变化时。在使用IDE开发的时候,会针对代码改变,给出一个快速的反馈循环,这是很有用的功能。默认地,任何classpath中的条目都会被标记成文件夹,来监控他的改变。注意确认资源,比如静态assets和view模板,不需要重启应用。
触发重启
Devtools监控的classpath资源,只有更新classpath一个方法触发重启。导致类路径更新的方法取决于你的IDE。在eclipse,保存一个改变的文件,类路径更新导致应用重启。在IDEA中,使用Build -> Make Project 来获得相同的效果。
只要派生可用,你也可以通过支持构建插件(比如Maven和Gradle)启动你的应用,因为DevTools需要一个孤立的应用加载器才能正常操作。当探测到DevTools在类路径中,Gradle和Maven默认会这么做。
当使用LiveReload时,自动重启工作非常友好。如果你使用JRebel,在动态加载类的时候自动重启会禁用。其他的devtools特性任然会有用(比如LiveReload,属性重载)。
重启的时候,在应用上下文中Devtools依赖的关闭钩子是不可用的。当然如果你禁用关闭钩子,那他也不会发生作用(SpringApplication.setRegisterShutdownHook(false))。
当类路径的条目发生改变会导致触发重启,DevTools自动忽略以下命名的项目,sping-boot,spring-boot-devtools,spring-boot-autoconfigure,spring-boot-actuator和spring-boot-starter。
Devtools能通过ApplicationContext来定制ResourceLoader:如果你的应用已经提供了一个加载器,他将会与其捆绑。在ApplicationContext中直接复写getResource方法是不被支持的。
重启 VS 重载
重启技术是spring boot提供两个加载器来实现的。不变的类(比如,第三方的jar包)载入到基础的加载器中。活动的类加载到重启加载器中。当应用重启,重启加载器被丢弃,并且一个新的类加载器会被创建。这种做法意味着应用重启比直接重新启动应用要快,因为基础加载器已经处于可用的状态。
如果你发现你的应用重启没有足够快,或者遭遇类加载的问题,你应该考虑重载技术,比如JRebel。他们在重载类时通过重写类,使其更适合重新加载。