37

我想在我的 Spring Boot 项目中使用热插拔。不知何故,我无法通过在我的 IDE (IntelliJ) 中运行它来使其工作,尽管文档涵盖了这个主题。我只是使用带有 VM 属性的 main 方法运行该类:

-javaagent:/path/to/jar/springloaded.jar -noverify

我的问题是,我该如何让它工作?:-)

进一步的问题是如何使用装有 Gradle 和 IntelliJ 的弹簧。我发现强制开发人员手动下载 JAR,将其放置在某处并使用 JVM 参数指向它非常不方便。有没有更好的方法(我应该配置我自己的任务来完成这项工作并从我的 IDE 作为 Gradle 任务运行它)?

4

5 回答 5

25

您需要按照文档中的说明配置项目:

http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#howto-reload-springloaded-gradle-and-intellij-idea

之后,您必须配置您的 IDE 以在 build/classes/main 中输出已编译的类(使用 Idea 插件,您可以按照上面链接中的指定配置 outputDir,然后调用gradle idea以完成它)。

然后,如果您启动任务(运行/bootRun)或使用调试模式从 IDE 运行主类,则在编译类时热代码重新加载应该可以工作。

这里的问题是 IntelliJ 与 Eclipse 不同,它不会在保存类时自动编译(即使您将编译器配置为“保存时构建”,它在运行/调试时也不会这样做)。这显然是 IntelliJ 做出的设计决定——如此处所述Intellij IDEA Java classes not auto compiling on save (CrazyCoder answer) 。

如果 spring boot 提供了一个配置选项来监视您的源代码文件并在它们发生更改时重新编译它们,那将是理想的——这就是 Grails 所做的。但我认为这样的想法还不存在,甚至可能无法将其与负责管理类路径之类的事情的 gradle 结合起来。

因此,据我所知,有两种选择:

  • 你记得编译你编辑的所有东西(添加一个更简单的编译快捷方式,如前面的 StackOverflow 链接中建议的那样可能会有所帮助)。
  • 您放置了一些文件系统监视器(Linux 的inotify-tools,Mac OS X 的launchd 是示例),当在任何源代码文件中检测到更改时调用 gradle compileJava/compileGroovy。

首先是乏味的,其次是缓慢的:)。实际上还有另一种选择:您更改 IDE :-D(或安装 EclipseMode IntelliJ 插件)。

于 2014-06-24T13:28:28.710 回答
25

如果希望能够仅从 IntelliJ 运行应用程序(在 main 方法上使用 Right Click -> Debug)并且根本不涉及 Spring Boot 的 Gradle 任务,您只需执行以下操作:

  1. 在 IntelliJ 中配置运行配置以使用 SpringLoaded 代理。这很容易做到,以下屏幕截图中显示了一个示例:

在此处输入图像描述

请注意我是如何添加的VM Option:(-javaagent:/path/to/springloaded-${version}.jar -noverify您可以在此处下载)

  1. 使用右键单击调试 -> 调试,如下图所示:

在此处输入图像描述

  1. 每次您进行更改并想要重新加载它时,只需编译项目即可。默认快捷方式是Cntrl+ F9,但您也可以从菜单Build->访问它Make Project
于 2014-09-30T10:44:14.030 回答
9

我设法在一个 Maven 项目中使用 IDEA 做到了这一点,我猜它也应该适用于 Gradle 版本,我的程序如下。

  • 设置 -> 编译器 -> 自动生成项目(仅在不运行/调试时有效!)
  • 使用 IDE 外部的 sprint-boot-plugin 启动项目(由于上面的句子,这是一个技巧)。

Maven 插件设置如下所示:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <dependencies>
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>springloaded</artifactId>
                    <version>1.2.0.RELEASE</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

现在更改一些代码并重新加载页面。

于 2014-08-08T15:27:26.280 回答
7

我在 IntelliJ Idea 中运行 SpringBoot 和 Gradle。自动重新加载工作 100%

  • 静态内容正在自动重新加载(立即)
  • Thymeleaf 正在自动重新加载(立即)
  • 控制器/Java 文件需要我点击“构建”按钮(需要几秒钟),但不需要重新启动 - 它只是编译文件,因此 Spring Loaded 可以拾取它们。

第 1 步:让 SpringLoaded 运行起来

buildscript {
    repositories {
        mavenCentral()
        jcenter()
    }

    dependencies {
        classpath "org.springframework.boot:spring-boot-gradle-plugin:1.2.1.RELEASE"
        classpath 'org.springframework:springloaded:1.2.1.RELEASE'
    }
}

apply plugin: 'java'
apply plugin: 'application'
apply plugin: 'idea'
apply plugin: 'spring-boot'

repositories {
    jcenter()
    mavenLocal()
    mavenCentral()
}

mainClassName = 'com.noxgroup.nitro.NitroApp'

idea {
    module {
        inheritOutputDirs = false
        outputDir = file("$buildDir/classes/main/")
    }
}

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web:1.2.1.RELEASE")
    compile("org.springframework.boot:spring-boot-starter-thymeleaf")
}

jar {
    baseName = 'org.noxgroup-nitro'
    version =  '0.1.0'
}

task wrapper(type: Wrapper) {
    gradleVersion = '1.11'
}

第 2 步:创建 Application.properties

并添加以下内容:

spring.thymeleaf.cache=false

步骤 3:运行 bootRun 任务

(不仅仅是标准运行任务——这增加了 SpringLoaded 功能)

第 4 步:编译 Java

通过点击“Make Project”或按“Ctrl/Command + F9”来制作您的 Java 文件

于 2015-03-02T13:20:49.863 回答
5

在更高版本的 gradle 中,您可以启动命令窗口并运行

gradle -t classes

这将启动一个查找源代码更改并重新编译它们的过程。

在另一场比赛中。

gradle bootRun

对 java 或 groovy src 的任何更改都将自动重新编译。虽然不是 intellij 特定的,但您可以使用 intellij。您甚至可以使用您最喜欢的文本编辑器(例如 submlime、atom )。

学分/链接

于 2016-02-03T00:40:30.753 回答