本文翻译自:http://docs.spring.io/spring-boot/docs/2.0.0.M2/reference/htmlsingle/
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。他们在重载类时通过重写类,使其更适合重新加载。
20.2.1 排除资源
有些资源在改变时不需要重启。比如,Thymeleaf模板的即时编辑。默认以下的路径中的文件改变不会触发重启应用,但会触发重载资源,他们是/META-INF/maven, /META-INF/resources ,/resources ,/static ,/public or /templates。如果你想定制路径,可以使用spring.devtools.restart.exclude属性。比如只包含/static路径和/public路径,可以像下面一样设定:
spring.devtools.restart.exclude=static/**,public/**
20.2.2 监视额外的路径
你也许在你改变的文件不在classpath路径下,你想让你的应用重启或重载资源。这样,使用spring.devtools.restart.additional-paths属性配置额外的路径来监控改变。您可以使用上述的spring.devtools.restart.exclude属性来控制附加路径下的更改是否会触发完全重新启动或只是实时重新加载。
20.2.3 禁用重启
如果你不想使用重启特性,你能使用spirng.devtools.restart.enabled属性来禁用。大多数情况下,你能在你的application.properties设定这些值(仍然会初始化重启类加载器,但是不会监控文件的变化)。
如果你需要完全禁用重启功能,比如,因为一个特殊的jar不工作,你需要在调用SpringApplication.run()之前设定这个System属性。比如:
public static void main(String[] args) {
System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(MyApp.class, args);
}
20.2.4 使用触发文件
如果你的IDE一直频繁地编译改变了的文件,你也许更倾向于在一个特殊的时间点触发重启。你可以使用触发文件,这是一个特殊文件,当你确实想要触发重启检查时,必须修改他。更改文件只会触发检查,重启需要在Devtools检查到某些必须执行的操作。触发文件可以手动更新,或使用IDE插件。
使用spring.devtools.restart.trigger-file属性来穹顶触发文件
20.2.5 定制重启类加载器
如上面重启VS重载部分所述,重启功能是通过使用两个类加载器来实现的。对于大多数的应用,这能很好地工作,然而,有时候会出现类加载的问题。
默认地,在IDE中打开任何项目都将加载restart类加载器,任何规范的jar包将会被所谓的base来加载器加载。如果你运行多个工程,不是每个模块都导入你的IDE,你也许需要定制一些参数。创建META-INF/spring-devtools.properties文件。
spring-devtools.properties文件包含restart.exclude.和restart.include.前缀熟悉。include元素是应该被拉到重启类加载器。exclude元素是应该被拉到基础类加载器。属性值会通过正则表达式匹配classpath。
比如:
restart.exclude.companycommonlibs=/mycorp-common-[\\w-]+\.jar
restart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar
注意:所有属性键必须是唯一的。只要属性是restart.include 或 restart.exclude开头的。这是值得注意的。
20.2.6 已知的限制
在对象使用一个标准ObjectInputStream反序列化时,重启功能不会运行的很好。如果你需要反序列化数据,你也许需要使用Spring的ConfigurableObjectInputStream和Thread.currentThread().getContextClassLoader()结合使用。
很不幸,第三方框架的反序列化不在context classloader的考虑范围之内。如果你发现这个问题,你会需要向框架的原始作者请求一个fix。