[翻译]SpringBoot系列-Spring Boot 参考1

本文翻译自: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.bootjava插件,都会添加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-bootspring-boot-devtools,spring-boot-autoconfigure,spring-boot-actuatorspring-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.includerestart.exclude开头的。这是值得注意的。

20.2.6 已知的限制

在对象使用一个标准ObjectInputStream反序列化时,重启功能不会运行的很好。如果你需要反序列化数据,你也许需要使用Spring的ConfigurableObjectInputStreamThread.currentThread().getContextClassLoader()结合使用。

很不幸,第三方框架的反序列化不在context classloader的考虑范围之内。如果你发现这个问题,你会需要向框架的原始作者请求一个fix。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,653评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,321评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,833评论 0 324
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,472评论 1 266
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,306评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,274评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,658评论 3 385
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,335评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,638评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,697评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,454评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,311评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,699评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,986评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,254评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,647评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,847评论 2 335

推荐阅读更多精彩内容