Intellij IDEA在保存时Java类没有自动编译

210

昨天我从Eclipse转到了IntelliJ IDEA。

我也在使用JRebel和WebSphere Server 7。

现在一切似乎都工作得相当好,除了一个问题:当我修改一个Java文件并保存时,IntelliJ不会重新编译该文件,以便JRebel能够捕获到它。

Eclipse的“自动构建”功能可以解决这个问题。

在IntelliJ IDEA中,我需要按CTRL+SHIFT+9重新编译相关类以便JRebel能够捕获到。如果更改涉及两个文件,则我需要对每个文件进行操作。由于IntelliJ使用“全部保存”机制,所以很难知道要手动重新编译哪些内容,而我也不太感兴趣做这件事。

难道没有一种方法让IntelliJ自己完成这个任务吗?


11
你为什么不直接按Ctrl+F9呢?这将构建整个项目,如果只有两个文件发生了更改,那么只会重新构建这两个文件。 - maba
2
我担心它会重建所有内容。我相信默认情况下重新构建时输出会被清除...所以通常这样做效果不太好... - mjs
5
它在构建之前不会清除。 这是增量构建。 如果需要,您可以选择重新构建。 - maba
1
看这个:https://dev59.com/IWIk5IYBdhLWcg3wFKpK#40062614 - Radu Toader
20个回答

295

已更新

对于IntelliJ IDEA 12+版本,如果我们使用外部编译器选项,则可以自动构建编辑后的源代码。唯一需要做的就是勾选“自动构建项目”选项,该选项位于“编译器”设置下:

编译器设置

此外,如果您想要热部署,当应用程序正在运行时或者您正在使用Spring Boot DevTools,则还应启用注册表中的compiler.automake.allow.when.app.running选项。这将自动编译您所做的更改。

对于2021.2以上的版本,我们需要勾选“即使开发应用程序当前正在运行也允许自动制作”选项: 输入图像描述

对于早于2021.2的版本:

使用Ctrl+Shift+A(在Mac上为+Shift+A)键入Registry,一旦注册表窗口打开,请启用compiler.automake.allow.when.app.running,请参见以下内容:

输入图像描述


对于早于12的版本,您可以使用*EclipseMode*插件使IDEA自动编译保存的文件。

有关更多提示,请参见“从Eclipse迁移到IntelliJ IDEA”指南。


12
感到很烦恼,因为我必须安装一个插件才能完成这个功能。我已经在昨天和今天都花了时间了。我希望他们可以直接内置一个选项,我不认为Eclipse对此功能拥有专利,对吗?我也可以将其重新映射到CTRL + S,使其自动保存。我将尝试几个选项。谢谢。 - mjs
20
这很慢。这太慢了。还有很大的提升空间!我不知道它在后台做什么,但是Intellij编译单个类中的一个小更改需要大约3-4秒钟。即使是“编译'StartController.java'”只针对一个类,也需要3-4秒钟。Eclipse完成这一操作只需要不到100毫秒。我将再次测试Eclipse插件并决定使用哪个... - mjs
37
“make project automatically” 只有在未运行/调试时才能工作。 - xenoterracide
8
对于我来说在使用Intellij 2017.1.3和Spring Boot DevTools时无法工作。 - Nico de Wet
4
无法运行,2020年4月。嘿,这是我的问题!刚发现。哈哈...我猜又要回到这里了。 - mjs
显示剩余15条评论

81
请遵循以下两个步骤:

1 - 启用编译器中的Automake

  • 按下:ctrl + shift + A (对于 Mac: + shift + A
  • 键入:make project automatically
  • 按下:Enter
  • 启用自动构建项目功能

2 - 应用运行时启用Automake

  • 按下:ctrl + shift + A (对于 Mac: + shift + A
  • 键入:Registry
  • 查找键值compiler.automake.allow.when.app.running启用它点击旁边的复选框

注意:现在重新启动应用程序 :)

注意:这也应该允许Spring Boot DevTools的实时重载。


2
完美,这正是我正在寻找的 =) - eitch
3
我使用spring-boot-devtools和IntelliJ IDEA 2016.2.5也成功实现了这个。 - Xaero Degreaz
2
好的,这似乎在IntelliJ 2017.1.3上可以工作,我使用了选项2,因为这是使用Spring Boot DevTools所需的选项。 - Nico de Wet
2
运行良好,但在JRebel中需要4-5秒才能重新加载。有什么解决方法吗? - druk
选项2对我有效。InteliJ 2017.3.1社区版。 - A1ucard
1
我认为上面的第1条和第2条不是“选项”,而是步骤。你需要同时完成它们两个。 - Thomas Carlisle

68

警告

Eclipse Mode 插件已经过时,不兼容最新的 IDEA 12+ 版本。如果您安装了它,IDE 将会在每次文件更改时挂起,并且响应极其缓慢。


IntelliJ IDEA 没有使用自动构建,它通过实时检测错误而非编译器来检测错误。类似于 Eclipse 模式将在 IDEA 12 中提供:

自动构建项目

使用 Build | Make,它会调用增量构建进程,仅编译已更改和依赖的文件(速度非常快)。

还有一个FAQ 条目可能会有所帮助。

有关自动构建功能的更新: 当运行/调试配置正在运行时,自动构建项目没有效果。磁盘上的类仅在 Build | Make 时才会更改。这是我们的核心设计决策,因为在我们看来,磁盘上的类更改应始终由用户控制。自动构建不是 Eclipse 功能的复制品,它的工作方式不同,并且其主要目的是在实际需要这些类之前(在运行应用程序或测试之前)节省等待类准备好所需的时间。自动构建不能替代您仍然需要触发的显式编译,就像在本问题中所描述的那样。如果您正在寻找不同的行为,则 FAQ 中链接的 EclipseMode 插件可能是更好的选择。


3
我已经尝试了12号版本几天了。使用“使用外部构建->自动构建”不会触发任何操作,什么也没发生。当我启用Eclipse模式插件(从设置中启用/禁用)时,它能正常工作,但是当我禁用Eclipse模式插件并启用“使用外部构建->自动构建”时,编辑和保存时什么也不发生……你知道为什么吗? - mjs
这个功能会在项目使用Maven时更新类文件吗?在target文件夹中创建的jar文件中的类文件是否会自动更新以反映更改? - Jeewantha
@Jeewantha 不,它不会更新jar文件。您可以为jar创建一个新的构件,并通过“Build”|“Build Artifacts”手动构建它,或者在构件中启用一个选项以在“Make”上构建它。 - CrazyCoder
2
@CrazyCoder 我刚回来使用jRebel。这太慢了,需要改进的空间太大了!我不知道它在后台做了什么,但Intellij编译一个小修改的单个类需要大约3-4秒钟。即使是“Compile 'StartController.java'”也只是一个类,也需要3-4秒钟。Eclipse则只需要不到100毫秒。我会再次测试插件并决定采用哪种方法。 - mjs
1
欢迎在 http://youtrack.jetbrains.com/issues/IDEA 上提出 @SecretService 标签行为的建议。已经有几个关于固定标签和防止它们关闭的问题处于开放状态。 - CrazyCoder
显示剩余15条评论

39

您可以将ctrl+s快捷键映射为一步保存和编译。转到快捷键设置并搜索Compile


3
谢谢,这是我最喜欢的!Intellij中的自动编译,以及这个也很好,但至少现在我能看到它何时完成了,速度太慢了。 - mjs
对我没用,将CTRL+S分配给编译没有重新启动我的服务器,请使用调试按钮开始。 - Dimitri Kopriwa
对我来说可以运行,Intellij 2018.2。它应该搜索“Build Project”。 - Neo Pham

20

实际上,两者都只需要1次点击,因此没有区别

  • Eclipse:手动保存,自动编译。
  • IntelliJ:自动保存,手动编译。

最简单的解决方案就是习惯它。因为当你大部分时间都在IDE中工作时,最好养成一个快速的习惯,而不是在几个IDE中养成缓慢的习惯。


2
有一种方法可以改善IntelliJ的体验:在您切换到浏览器时保存和编译。 - ruX
1
@Max,IntelliJ在提交期间运行这些操作(对我个人而言是最好的时机)。在某些情况下,它还可以直接在编辑器中突出显示编码风格问题(例如,对于Python的PEP8符合性)。 - andruso
3
习惯了一个集成开发环境(IDE)给我做的事情,而另一个却不行,这让我的生活变得更加困难,这并不是一个好的卖点。 - Jonathan
1
@Jonathan 提高可用性通常需要让用户放弃旧的、不必要的习惯。 - andruso
@NicodeWet 在Mac上将F1、F2等键设置为标准功能键可以显著加快开发速度。 - andruso
显示剩余3条评论

17

最后,我录制了一个来实现一键保存和编译,并将快捷键Ctrl+s绑定到宏上。


6
@SecretService 可能无法适用于所有人,因为当多个操作映射到同一快捷键时,行动顺序未被定义。 - Celos

14

我通过使用宏来解决了这个问题。

我开始录制一个宏:

  • 点击编辑-宏-开始宏录制
  • 点击文件-全部保存
  • 点击构建-项目生成
  • 点击编辑-宏-停止宏录制

将其命名为有用的名称,比如“SaveAndMake”。

现在只需删除“全部保存”快捷键,并将相同的快捷键添加到你的宏中!

因此,每次保存时,它都会保存并进行一次脏编译,jRebel现在可以正确检测到所有更改。


建议为宏分配不同的按键绑定,而不是替换现有的全部保存-但这只是同样主观的建议。 - arcseldon
谢谢。由于普通的“构建”(如其他答案所建议)对我来说甚至都不够,因此我使用这个解决方案每次保存+重建。即使它消耗了大量资源,也让我回到了Eclipse的感觉... - Boris

5
请仔细按照以下步骤启用它。

1)使用SB V1.3创建Spring Boot项目,并将"Devtools"(1*)添加到依赖项中

2)调用Help->Find Action...并键入"Registry",在对话框中搜索"automake"并启用条目"compiler.automake.allow.when.app.running",关闭对话框

3)在Settings->Build, Execution, Deployment->Compiler中启用后台编译"Make project automatically"

4)打开Spring Boot运行配置,如果一切都配置正确,您应该会收到警告消息

5)运行您的应用程序,在运行时更改您的类

请将您的经验和问题作为评论报告给此问题。

单击此处获取更多信息


它仍被标记为“正在进行中”,对我来说不起作用。 - JGarrido

3

针对使用新版 Intellij 但找不到 compiler.automake.allow.when.app.running 的用户:

https://youtrack.jetbrains.com/issue/IDEA-274903

基本上,该选项现已移至 设置 -> 高级设置 -> 编译器(勾选“允许自动构建”选项)。


谢谢...但我仍然无法让它工作,虽然说实时服务器正在运行,但当我更改类字符串时没有任何反应。 - gunslingor

3
对于Intellij 2021或更新版本,您将找不到注册表项compiler.automake.allow.when.app.running。它已经移动到高级设置中,如下面的截图所示。请参考以下链接:IntelliJ Advanced Settings Screenshot。来源:https://youtrack.jetbrains.com/issue/IDEA-274903

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接