【问题标题】:Spring Boot + Spring-Loaded (IntelliJ, Gradle)Spring Boot + Spring-Loaded(IntelliJ、Gradle)
【发布时间】:2014-08-13 19:11:14
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您说您阅读了文档。也许您没有发现插件会为您下载并附加代理的事实?
  • 你是什么意思?你的意思是gradle依赖?我不确定,因为在文档中它说依赖项应该放在 buildscript 块中,因此它是构建脚本而不是应用程序的依赖项 - 我不诚实地理解它。能给我举个例子吗?
  • 文档中的示例是正确的。您将加载的依赖项添加到构建脚本(因此它可用于插件)。如果您使用 --info 启动 gradle,您将看到正在附加的代理。是什么不工作?
  • 我在那里看到代理“正在附加代理... springloaded-1.2.0.RELEASE.jar”,但它无论如何都不起作用。即使我使用 gradle“gradle run”或“gradle bootRun”从命令行运行它。在我的 IDE 中,我通常只运行我认为最方便的主类(启动速度)。我想在那里重新加载,但即使指定 springloaded.jar 依赖项(请参阅我的原始问题)也无济于事。我可能错过了文档中的某些内容,或者我完全迷失了:-(
  • @kuceram 仅供参考,如果你更喜欢运行主类,你可以这样做非常好:在Run -> Reload changed classes 上设置一个键盘快捷键。使用 SL 也可能很方便。

标签: spring spring-boot spring-loaded


【解决方案1】:

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

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来完成) .

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

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

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

据我所知,有两种选择:

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

第一个很乏味,第二个很慢:)。实际上还有另一种选择:您更改 IDE :-D(或安装 EclipseMode IntelliJ 插件)。

【讨论】:

  • 感谢大家的建议,当我通过运行 main 方法从 IDE 运行应用程序时,我想我会选择 @cfrick 建议的“运行 -> 重新加载更改的类”的 IDEA 快捷方式。我认为任何可以监视源文件并在发生更改时构建它们的 gradle 插件都会非常好
  • 有关如何在 IntelliJ 中配置保存和构建快捷方式,请参见:stackoverflow.com/questions/14635602/…
  • howto-reload-springloaded-gradle-and-intellij-idea 的给定链接已损坏。
  • gradle -t classes 在单独的终端上也可以正常工作。
【解决方案2】:

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

gradle -t classes

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

在另一个运行中。

gradle bootRun

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

credits/link

【讨论】:

    【解决方案3】:

    我正在 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

    点击“制作项目”或按“Ctrl/Command + F9”制作您的 Java 文件

    【讨论】:

    • 这让我走上了正确的道路,但我不得不特别使用 org.springframework:springloaded:1.2.4.RELEASE 作为我的弹簧加载版本 - 谢谢
    【解决方案4】:

    如果希望能够仅从 IntelliJ 运行应用程序(在 main 方法上使用右键单击 -> 调试)并且完全不涉及 Spring Boot 的 Gradle 任务,您只需执行以下操作:

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

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

    1. 使用右键调试 -> 调试如下截图:

    1. 每当您进行更改并想要重新加载它时,只需编译项目即可。默认快捷键是Cntrl+F9,但您也可以从菜单Build -> Make Project 访问它

    【讨论】:

      【解决方案5】:

      我设法在一个 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>
      

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

      【讨论】:

        猜你喜欢
        • 2015-05-15
        • 1970-01-01
        • 2015-09-09
        • 2019-03-17
        • 2015-02-27
        • 1970-01-01
        • 2016-10-16
        • 1970-01-01
        • 2021-01-18
        相关资源
        最近更新 更多