【问题标题】:Spring Boot Devtools by ExampleSpring Boot Devtools 示例
【发布时间】:2016-09-20 16:35:02
【问题描述】:

根据Spring Boot Devtools docs,devtools 不会在“生产模式”下运行;也就是说,如果您使用 java -jar .., 执行 Spring Boot 应用程序,那么它将不会使用 devtools 的内置 JVM 魔法。但是,Spring Boot starter docs 仅向您展示了一种运行 Spring Boot 应用程序的方法...通过java -jar...。

首先我想知道:如何在非生产模式下运行我的 Spring Boot 应用程序?我知道您可以使用 Spring Boot CLI(例如 spring run)运行您的应用程序,但是这是唯一的方法吗?

此外,相同的 devtools 文档提到您可以使用 excludeDevtools 选项从生产二进制文件中显式删除 devtools jar,但他们从未解释在何处/如何使用它。这里有什么例子/想法吗?

【问题讨论】:

    标签: java spring-boot


    【解决方案1】:

    从 Spring boot 和 devtools 开始,开发变得更加容易。 Spring Boot 使用嵌入式 servlet 容器(tomcat、undertow、jetty),即使在非生产环境中,您也可以拥有生产就绪代码。

    关于如何在非生产环境中运行 Spring-boot 应用程序的问题,我们可以通过右键单击直接从 Spring 工具套件 IDE 运行应用程序 -> 如果是本地环境,则作为 Spring boot 运行。

    如果使用的构建工具是 maven,则从命令提示符 mvn boot:run ,如果是 gradle,则在命令提示符下从项目位置的根文件夹 gradle bootRun。如果您将应用程序打包为 uber jar,那么 Java -jar ..,如果您的环境是 Linux,您也可以作为进程启动。

    关于忽略生产环境中的devtools,如果我们在构建工具(maven,gradle)的依赖项中指定Spring-boot-devtools作为可选范围,Spring boot会智能地忽略devtools jar。在 gradle 中,Spring boot gradle 插件负责忽略最终部署的 jar 或 war 的 devtools

    更新 :: 调试使用 Gradle 运行的 Spring Boot 应用程序,参见http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#howto-remote-debug-gradle-run596

    将此添加到您的 build.gradle 文件中:

    applicationDefaultJvmArgs = [

    "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005" ]

    在 IntelliJ Idea IDE 或 STS 中,设置新的调试配置并在选项中选择“远程”。默认值应该没问题,但要注意端口号和传输类型(“socket”)。玩得开心!

    【讨论】:

    • 感谢 @rajadilipkolli (+1) - gradle bootRun 也可以在调试模式下运行您的应用程序吗?
    • 对于应用程序和任何正在寻找调试使用 Gradle 运行的 Spring Boot 应用程序的方法的人,如 docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/… 所示,将其添加到您的 build.gradle 文件中:applicationDefaultJvmArgs = [ "-agentlib:jdwp =transport=dt_socket,server=y,suspend=y,address=5005" ] 在 IntelliJ Idea 中,设置新的 Debug 配置并在选项中选择“Remote”。默认值应该没问题,但要注意端口号和传输类型(“socket”)。玩得开心!
    【解决方案2】:

    1) 在非生产模式下(即不是从 JAR)运行 Spring Boot 应用程序的一个示例是从 IDE(尤其是 Eclipse 或 IntelliJ),您可以在其中从 main 方法启动应用程序,或者使用Spring Boot 启动支持。这是开发工具最实用的用途,因为它允许在不重新启动的情况下持续观察应用程序的变化。

    2) excludeDevTools 是 Spring Boot Maven 插件 http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/maven-plugin/repackage-mojo.html 或 Gradle 插件的一个选项 - 请参阅 http://docs.spring.io/spring-boot/docs/current/reference/html/build-tool-plugins-gradle-plugin.html#build-tool-plugins-gradle-repackage-configuration。

    所以在你的情况下 bootRepackage { mainClass = 'demo.Application' excludeDevtools = true }

    【讨论】:

    • 感谢@Marius Bogoeivic (+1)!如果您不介意,请进行一些后续操作:(1) 我发现我可以使用 Spring Boot CLI 运行我的应用程序(使用诸如 spring run ... 之类的命令)。是否可以使用此 CLI 运行带有 devtools(用于热交换)以及 debug mode 的 Spring Boot 应用程序? *(2)**如果我排除了开发工具,你能否确认 devtools 将 *only 从打包的 uber-jar 中排除?再次感谢!!!
    • (2) 是的 - 这就是它的作用 - 防止 devTools 被打包到 uberjar 中,即使添加为依赖项。
    • (1) 我不太确定 spring run 在这种情况下如何工作,因为 devtools 依赖于不断重新编译的代码 - spring run 不会这样做(即使在这种情况下Intellij 的项目,需要进行项目才能进行更改)。好消息是你可以使用 Gradle 来运行你的应用程序和 devtools,使用 Gradle - 这是一个例子 dzone.com/articles/…。
    猜你喜欢
    • 2017-11-24
    • 1970-01-01
    • 2021-03-02
    • 1970-01-01
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    相关资源
    最近更新 更多