【问题标题】:IntelliJ IDEA doesn't redeploy changesIntelliJ IDEA 不会重新部署更改
【发布时间】:2015-03-07 15:39:23
【问题描述】:

我有一个 Spring Web 应用程序,当我在 Tomcat 中使用 IDEA 的调试器进行调试并在进行一些更改后重新部署项目时,未部署更改并且调试器“看到”旧代码(单步执行错误或空行)。唯一有帮助的是运行 maven clean install 然后再次启动 Tomcat。

我尝试清除 IDEA 缓存,但没有帮助。

Hotswap 也不起作用,虽然我在设置中选择了正确的选项,但我可以忍受。

请注意,我使用重新部署而不是热插拔,所以整个应用程序重新启动,它应该重新加载所有类,但它没有。只有在 Maven 构建之后它才能工作。

注意 2:我认为一个月前它还可以,但我想不出任何改变可以做到这一点(项目或 IDEA)

编辑:所以热插拔现在工作正常(神奇的是,我什么都没做)。但是当我进行较大的修改(例如方法签名更改等)时,它们不会在重新部署到服务器期间被拾取。因此,我需要运行 maven clean install 并再次启动服务器以查看更改并在此新代码上修改方法主体后让热插拔正常工作。知道为什么吗?

【问题讨论】:

  • 我看过这个这个答案,我的设置完全相同。
  • 你能贴一张你的运行/调试配置的截图吗?另外,您使用的是什么版本的东西?即 IntelliJ IDEA、Tomcat、Java、Spring。我只是在一个简单的 webapp 项目上重试了这个,一切都按预期工作。

标签: java maven tomcat intellij-idea


【解决方案1】:

您需要检查您的 tomcat 的运行配置,在“启动前”中应该有 Make 和 Build 工件步骤,还要确保您更改的所有类都在重新部署期间真正编译 - 这是我要开始的地方。

另外我不明白你为什么使用重新部署而不是热插拔?重新部署通常与重新启动服务器一样耗时,但热插拔几乎是即时的。虽然它只允许更改方法体和常量,但通常在开发中重新部署它是更可取的。就我个人而言,我正在使用 JRebel,它现在对非商业项目是免费的,并且很少重启服务器。

编辑: 我不知道为什么即使重新部署后你的类还是旧的,但原因是 99% 的原因是它们在更改为爆炸文件夹后没有编译。每次代码更改后进行 maven clean install 太多了(IDE 编译应该足够了)。

我可以建议您不要重新部署,而是在进行重大更改后重新启动服务器。以便 IDE 执行 Make、Build artifact 和 Deploy artifact 任务。

【讨论】:

  • 在“发射前”中,我有“制造”和“爆炸战争神器”。正如我所说,热插拔也不起作用,它说它正在编译类,然后它显示“所有文件都是最新的”,但调试器仍然错过了更改(即使它们在方法体中)。
  • 设置中的 Debugger -> HotSwap 部分有什么?应该有 3 个单选按钮,您应该将“编译后重新加载类”设置为“始终”或“询问”。另外要明确一点:您需要在调试模式下运行 tomcat,或者使用远程调试器连接到它。
  • 我确实有“总是”。即使热插拔不起作用,重新部署也应该。我也可以很好地调试代码,但是更改需要通过 maven 构建才能让调试器看到。我使用的是本地tomcat,为什么需要使用remote?还有一件事:一个月前它确实工作得很好。
【解决方案2】:

除了 david.lucky 提示之外,请确保在部署部分的 Tomcat 配置中,您使用的是分解的工件

【讨论】:

    【解决方案3】:

    我也遇到了同样的问题!我花了几个小时来解决这个问题。

    我不知道为什么,但我的解决方案是(我正在使用 MacOS High Sierra):

    • 首先,我在我的桌面上的文件夹 /Desktop/tutorial/ 中有一些我正在处理的教程项目...这些项目运行良好。我可以重新部署,并且 Tomcat 正在识别我的 java 文件中的更改。

    • 然后我开始了一些新的、自己的项目,并将它们放在我的主目录中,例如 /Users/myHomeDirectory/WebApps/。 我可以构建和运行这些对象,但是当我进行更改时,我遇到了同样的问题,即 Tomcat 无法识别结果。当我单击 Maven 按钮“重新导入所有 Maven 项目”时,唯一有帮助的事情。

    • 我尝试了很多不同的东西。没有任何效果。

    • 然后我想,也许我的项目有问题。所以我从 Desktop 中取出我的一个项目并将它们复制到我的主目录中。但是突然之间,我又遇到了同样的问题。

    • 这是我的解决方案:我再次在桌面上创建了一个新项目。我不知道为什么,但现在它工作正常。我真的不知道为什么。相信我,我没有更改任何设置。我完全一样!


    以及关于无需重新部署的生命重载。这对我来说真的很好(没有像 JREbel 这样的插件):
    • Go Run –> Edit Configurations –> “Deployment” 选项卡,点击 + 图标 –> 选择“exploded artifact”
    • 选择“服务器”选项卡,更新以下选项:

      1. 在“更新”操作中 -> 更新类和资源
      2. 帧停用 -> 更新类和资源
    • 在调试模式下运行 Web 应用程序。尝试修改一些代码或资源(Java文件,...),修改后的类和资源会自动重新加载。

    【讨论】:

      【解决方案4】:

      在几个月前从 eclipse 切换到 Intellij 之后,这已经发生了一段时间。 使用了上面提到的标准 tomcat 配置和调试设置。

      Intellij 将在没有重新加载或重新加载一个类后显示绿色弹出窗口。 然而,调试器的字节码与重新加载/更新的代码不同。

      您可以强制重新编译,这将适用于小的更改ctr shift F9。 除此之外,全新安装似乎适用于注释、方法定义更改等。如果您尝试重新编译,调试器将使服务器失败。

      所以答案是您更改的文件上的ctrl shift F9

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-12
        • 1970-01-01
        • 1970-01-01
        • 2016-06-13
        • 1970-01-01
        相关资源
        最近更新 更多