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

Intellij IDEA Java classes not auto compiling on save

提问人:mjs 提问时间:10/5/2012 最后编辑:informatik01mjs 更新时间:1/13/2022 访问量:207634

问:

昨天我从 Eclipse 切换到 IntelliJ IDEA。

我也在 WebSphere Server 7 中使用 JRebel。

现在一切似乎都正常工作,除了当我修改 Java 文件并点击保存时,IntelliJ 不会重新编译该文件,以便 JRebel 获取它。

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

在 IntelliJ IDEA 中,我必须按 ++ 重新编译相关类,以便 JRebel 拿起它。如果对两个文件进行更改,我必须对每个文件和其中一个文件执行此操作,并且由于 IntelliJ 使用保存所有机制,因此很难知道手动重新编译什么,我对此也不感兴趣。CTRLSHIFT9

难道没有办法让 IntelliJ 自己做到这一点吗?

Java jakarta-ee intellij-idea jrebel

评论

11赞 maba 10/5/2012
你为什么不直接按+?这将构建整个项目,如果只有两个文件已更改,则将重新构建这些文件。CtrlF9
2赞 mjs 11/1/2012
我担心它会重建一切。我相信默认值是重建时的明确输出......所以通常这不会很好......
5赞 maba 11/1/2012
它不会在构建前清洁。这是一个增量构建。如果需要,您还有另一种重建选择。
1赞 Radu Toader 10/16/2016
看看这个:stackoverflow.com/questions/19596779/...

答:

295赞 dan 10/5/2012 #1

更新

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

Compiler Settings

此外,如果您想在应用程序运行时进行热部署,或者如果您正在使用 Spring Boot devtools,您也应该启用 from 注册表。这将自动编译您的更改。compiler.automake.allow.when.app.running

对于高于 2021.2 的版本,我们需要选中“即使开发应用程序当前正在运行,也允许自动启动”选项:enter image description here

对于早于 2021.2 的版本:

使用++(或Mac上的++)类型打开注册表窗口后,找到并启用,请参阅此处:CtrlShiftAShiftARegistrycompiler.automake.allow.when.app.running

enter image description here


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

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

评论

12赞 mjs 10/5/2012
感觉很烦人,我必须为此安装一个插件。我已经花了昨天和今天的时间。我希望他们能为此构建一个选项,我认为 Eclipse 没有这个功能的专利,是吗?我还可以重新映射到 CTRL + S 以使其自动保存。我会尝试几个选择。谢谢
20赞 mjs 1/5/2014
这很慢。这太慢了。还有很大的改进空间!我不是它在后台所做的事情,但 Intellij 大约需要 3-4 秒才能在一个类中编译一个小的更改。即使是“编译'StartController.java'”,这意味着一个类只需要 3-4 秒。Eclipse 在不到 100 毫秒的时间内完成此操作。我将再次测试eclipse模式插件并决定使用什么..
37赞 xenoterracide 9/8/2014
“自动制作项目”仅在不运行/调试时有效
8赞 Nico de Wet 5/29/2017
使用 Intellij 2017.1.3 和 spring boot devtools 对我不起作用。
4赞 mjs 4/28/2020
不起作用 2020.4.嘿,这是我的问题!刚刚发现。哈哈......我猜又回来了。
68赞 CrazyCoder 10/5/2012 #2

警告

Eclipse Mode 插件已过时,与最近的 IDEA 12+ 版本不兼容。如果安装它,IDE 将在每次文件更改时挂起,并且响应速度非常慢。


IntelliJ IDEA 不使用自动构建,而是动态检测错误,而不是通过编译器。与 Eclipse 模式类似,将在 IDEA 12 中提供:

Make project automatically

用途 |,它调用增量 make 过程,该过程将仅编译已更改和依赖的文件(速度非常快)。BuildMake

还有一个常见问题解答条目可能会有所帮助。

自动制作功能的更新: 当运行/调试配置正在运行时,没有效果。磁盘上的类仅在 | 上更改。这是核心设计决策,因为在我们看来,磁盘上的类更改应该始终在用户的控制之下。自动制作不是 Eclipse 功能的模仿者,它的工作方式不同,它的主要目的是节省等待类在真正需要时准备就绪的时间(在运行应用程序或测试之前)。自动生成不会替换您仍然需要触发的显式编译,如本问题中描述的情况。如果您正在寻找不同的行为,上面常见问题解答中链接的 EclipseMode 插件将是一个更好的选择。Make project automaticallyBuildMake

评论

0赞 mjs 10/5/2012
是的,我以前看过它,但认为它太慢了,包括弹出窗口等等。以为是为了别的什么。我可能会尝试一下 尽管 CTRL + 9 很烦人,但我想我可以重新映射到 CTRL + S 以使其自动保存。
0赞 mjs 10/5/2012
感谢您的更新。我已经安装了 Eclipse Mode 插件。没有那个对话框...哎呀..智能 12 ...好吧,很高兴你正在进步。intellij 12 平分秋色吗?
3赞 mjs 11/1/2012
我已经尝试了 12 几天了。使用外部构建 -> make 自动不会触发任何操作。 没什么快乐的。当我使用运行良好的 eclipse 模式插件(从设置中启用/禁用它)时,但是当我禁用 eclipse 模式插件并启用“使用外部构建 -> 自动制作”时,编辑和保存时没有任何反应......知道为什么吗?
2赞 mjs 1/5/2014
@CrazyCoder 我刚刚回到了这个和 jRebel。这太慢了。还有很大的改进空间!我不是它在后台所做的事情,但 Intellij 大约需要 3-4 秒才能在一个类中编译一个小的更改。即使是“编译'StartController.java'”,这意味着一个类只需要 3-4 秒。Eclipse 在不到 100 毫秒的时间内完成此操作。我将再次测试该插件并决定使用什么..
1赞 CrazyCoder 12/15/2014
youtrack.jetbrains.com/issues/IDEA 欢迎@SecretService选项卡行为建议。关于固定选项卡并阻止它们关闭,已经存在几个未解决的问题。
39赞 Daniel Kaplan 12/19/2012 #3

您可以一步到位地进行 keymap 保存和编译。转到键盘映射设置并搜索 。ctrl+sCompile

评论

3赞 mjs 1/5/2014
谢谢,我最喜欢这个!intellij 中的自动编译,以及这个,但至少我现在看到它何时完成,太慢了。
0赞 Dimitri Kopriwa 8/6/2016
对我不起作用,分配 CTRL+S 进行编译没有重新启动我的服务器,从调试按钮开始
0赞 Neo Pham 4/6/2019
它对我有用,Intellij 2018.2。它应该搜索“生成项目”
17赞 TonioKnight 1/24/2013 #4

我最终录制了一个,以便一步保存和编译,并对其进行键盘映射。Ctrl+s

评论

6赞 Celos 5/23/2014
@SecretService 可能并不适合所有人,因为当多个操作映射到同一快捷方式时,操作顺序未定义。
1赞 user3214451 12/27/2014 #5

我有同样的问题。 我使用的是“省电模式”,它可以防止增量编译并显示编译错误。

评论

0赞 Nerius Jok 7/9/2018
我不知道为什么这个答案被否决了,它也回答了这个问题,对我来说是一样的 - “省电模式”,虽然它写在设置中,但启用了自动编译不起作用。
14赞 Niklas Lönn 2/27/2015 #6

我设法使用宏解决了这个问题。

我开始录制一个宏:

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

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

现在只需删除“保存所有键绑定”,并将相同的键绑定添加到宏中!

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

评论

0赞 arcseldon 5/22/2016
建议给宏一个不同的键绑定,而不是替换现有的全部保存 - 但这同样是主观的。
0赞 Boris 6/3/2020
谢谢。由于正常的“构建”(如其他答案所建议的那样)对我来说甚至还不够,因此我每次都使用此解决方案来保存 + 重建。让我找回了 Eclipse 的感觉,即使它消耗了大量资源......
20赞 andruso 3/2/2015 #7

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

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

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

评论

2赞 ruX 12/14/2015
有一些方法可以改善 IntelliJ 体验:在切换到浏览器时保存和编译
0赞 Max 4/21/2016
Eclipse 能够添加保存操作,因此您还可以在保存时组织导入和格式化代码。手动执行所有这些操作会增加大量击键,并使该过程更容易出错。例如,如果您在 Eclipse 中保存时格式化,则永远不会有未格式化的代码。在 IntelliJ 中很容易忘记格式化。
1赞 andruso 6/8/2016
@Max,IntelliJ 在提交期间运行这些操作(根据我个人的口味,这是最好的时刻)。在某些情况下,它还会直接在编辑器中突出显示编码风格问题(例如,python 的 PEP8 一致性)。
3赞 Jonathan 11/11/2016
习惯一个 IDE 为我做而另一个 IDE 没有做的事情,这让我的生活更加困难,这不是一个好的卖点。
1赞 andruso 12/28/2016
@Jonathan提高可用性通常需要用户放弃旧的、通常是不必要的习惯。
1赞 sbmpost 3/1/2016 #8

使用 Reformat and Compile 插件(灵感来自 Alexandre DuBreuil 的 Save Actions 插件):

https://plugins.jetbrains.com/plugin/8231?pr=idea_ce

目前我只提供了一个 jar 文件,但这是代码中最重要的部分:

private final static Set<Document> documentsToProcess = new HashSet<Document>();
private static VirtualFile[] fileToCompile = VirtualFile.EMPTY_ARRAY;

// The plugin extends FileDocumentManagerAdapter.
// beforeDocumentSaving calls reformatAndCompile
private static void reformatAndCompile(
        @NotNull final Project project,
        @NotNull final Document document,
        @NotNull final PsiFile psiFile) {
    documentsToProcess.add(document);
    if (storage.isEnabled(Action.compileFile) && isDocumentActive(project, document)) {
        fileToCompile = isFileCompilable(project, psiFile.getVirtualFile());
    }
    ApplicationManager.getApplication().invokeLater(new Runnable() {
        @Override
        public void run() {
            if (documentsToProcess.contains(document)) {
                documentsToProcess.remove(document);
                if (storage.isEnabled(Action.optimizeImports)
                        || storage.isEnabled(Action.reformatCode)) {
                    CommandProcessor.getInstance().runUndoTransparentAction(new Runnable() {
                        @Override
                        public void run() {
                            if (storage.isEnabled(Action.optimizeImports)) {
                                new OptimizeImportsProcessor(project, psiFile)
                                    .run();
                            }
                            if (storage.isEnabled(Action.reformatCode)) {
                                new ReformatCodeProcessor(
                                        project,
                                        psiFile,
                                        null,
                                        ChangeListManager
                                            .getInstance(project)
                                            .getChange(psiFile.getVirtualFile()) != null)
                                                .run();
                            }
                            ApplicationManager.getApplication().runWriteAction(new Runnable() {
                                @Override
                                public void run() {
                                    CodeInsightUtilCore.forcePsiPostprocessAndRestoreElement(psiFile);
                                }
                            });
                        }
                    });
                }
            }

            if (fileToCompile.length > 0) {
                if (documentsToProcess.isEmpty()) {
                    compileFile(project, fileToCompile);
                    fileToCompile = VirtualFile.EMPTY_ARRAY;
                }
            } else if (storage.isEnabled(Action.makeProject)) {
                if (documentsToProcess.isEmpty()) {
                    makeProject(project);
                }
            } else {
                saveFile(project, document, psiFile.getVirtualFile());
            }
        }
    }, project.getDisposed());
}

private static void makeProject(@NotNull final Project project) {
    ApplicationManager.getApplication().invokeLater(new Runnable() {
        @Override
        public void run() {
            CompilerManager.getInstance(project).make(null);
        }
    }, project.getDisposed());
}

private static void compileFile(
        @NotNull final Project project,
        @NotNull final VirtualFile[] files) {
    ApplicationManager.getApplication().invokeLater(new Runnable() {
        @Override
        public void run() {
            CompilerManager.getInstance(project).compile(files, null);
        }
    }, project.getDisposed());
}

private static void saveFile(
        @NotNull final Project project,
        @NotNull final Document document,
        @NotNull final VirtualFile file) {
    ApplicationManager.getApplication().invokeLater(new Runnable() {
        @Override
        public void run() {
            final FileDocumentManager fileDocumentManager = FileDocumentManager.getInstance();
            if (fileDocumentManager.isFileModified(file)) {
                fileDocumentManager.saveDocument(document);
            }
        }
    }, project.getDisposed());
}

评论

2赞 Drew 3/1/2016
为什么有人会下载一些随机代码并运行它?
0赞 sbmpost 3/1/2016
@Drew:刚刚上传到 Jetbrains 进行审核。但如果你是偏执狂,我想你可以等几天才能从那里获得它......
0赞 Drew 3/1/2016
sbmpost,我只是指出为什么有些人会(不是我这样做)投反对票,标记为“不是答案”,然后将其删除。
0赞 Drew 3/2/2016
如果它是代码,你可以用文本发布,那就太好了。你能吗?这是一个代码站点。
1赞 sbmpost 3/2/2016
@drew:添加了有关 jar 的注释,并为代码添加了更多上下文。它可能看起来很高级,但如果你从 FileDocumentManagerAdapter 扩展并添加代码,你(几乎)会有一个编译 ReformatAndCompile 类。
81赞 snovelli 4/25/2016 #9

请按照以下两个步骤操作:

1 - 从编译器启用自动制作

  • 按:+ +(适用于 MacctrlshiftA + shift + A)
  • 类型:make project automatically
  • 打:Enter
  • 启用功能Make Project automatically

2 - 在应用程序运行时启用自动制作

  • 按:+ +(适用于 MacctrlshiftA + shift + A)
  • 类型:Registry
  • 找到密钥并启用它,或单击旁边的复选框compiler.automake.allow.when.app.running

注意:立即重新启动应用程序:)

注意:这还应该允许使用 spring boot devtools 进行实时重新加载。

评论

2赞 eitch 10/14/2016
完美,这正是我想要的=)
3赞 Xaero Degreaz 10/20/2016
这也适用于spring-boot-devtools和IntelliJ IDEA 2016.2.5
2赞 Nico de Wet 5/29/2017
是的,这似乎适用于IntelliJ 2017.1.3,我使用了选项2,因为这是Spring Boot开发工具所需要的。
2赞 druk 9/20/2017
效果很好,但在 JRebel 中重新加载需要 4-5 秒。有什么办法可以解决这个问题吗?
1赞 Thomas Carlisle 1/28/2018
我不认为上面的第 1 项和第 2 项是“选项”,而是步骤。你需要两者兼而有之。
5赞 Ajay Kumar 2/2/2017 #10

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

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

2) 调用 Help->Find 操作...并键入“注册表”,在对话框中搜索“automake”并启用条目“compiler.automake.allow.when.app.running”,关闭对话框

3)在Settings->Build, Execution, Deployment->Compiler中启用后台编译“自动制作项目”

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

5)运行您的应用程序,即时更改您的课程

请将您的经验和问题作为对本期的评论报告。

点击这里查看更多信息

评论

0赞 JGarrido 2/11/2017
它被标记为“进行中”,对我不起作用。
2赞 keyboardsamurai 4/29/2017 #11

在我的 maven 项目中,唯一受此影响的方法是将“测试编译”目标添加到我的单元测试的运行配置中。令人难以置信的笨拙解决方案,但它有效。

enter image description here

评论

0赞 anindis 7/19/2017
至少它:D有效但是,是的,最好找到这个问题的根源
-2赞 lance fallon 7/14/2017 #12

没有足够的点来评论现有的答案,但与上面的一些人类似,我最终只是添加了一个宏和键盘映射来组织导入/格式/保存所有/快速重载(F9)/同步

添加同步是因为它似乎是我还可以查看由外部构建工具/观察者(即 webpack)修改的资源更新的唯一方法。

该过程比eclipse慢 - 并且对于外部文件刷新,通常必须多次运行该命令 - 但假设我可以忍受它。

2赞 tworec 10/24/2017 #13

Intellij 在其他模块中遇到编译问题时会悄悄失败,然后不执行自动构建。所以检查你的窗户Problems

0赞 Priyanshu Singh 5/7/2018 #14

我收到错误:某些 jar 不在类路径中。所以我只是删除损坏的 jar 和 perrform 下面的步骤

1.Project >  Setting>Build,Execution,Deployment>Compiler>check build project automatically
2.CTRL+SHIFT+A find/search **registry** --Check for below param
compiler.automake.allow.when.app.running
compiler.automake.trigger.delay=500---According to ur requirement
3.Add devtool in pom.xml
         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>
4.Build ,If found any probelm while building ,saying some jar in not in class path.Just delete the corrupted jar
and re-build the project angain after sync with maven lib
1赞 Asanka Siriwardena 8/30/2018 #15

编辑运行/调试配置,以便在启动之前选择“生成”选项

enter image description here

选择“生成后”选项

enter image description here

上述解决方案在开发我的 JBehave 测试套件时对我有用

评论

0赞 kisna 3/6/2020
这很好,但问题是关于在保存时自动编译,而不必在执行运行测试等任何事情之前使用自定义命令再次编译显式性,
1赞 Orkun 3/12/2019 #16

由于我的项目结构中有一个不必要的模块,它对我不起作用。我想,测试是使用另一个模块执行的。

我不知道它是如何变成这样的,但删除它解决了这个问题。

确保您的“运行/调试”设置使用您正在通过自动保存构建的模块。

例如:请参阅模块

enter image description here

您可以在项目结构 - 模块中更改模块

enter image description here

1赞 Sergei Podlipaev 2/10/2020 #17

我有同样的问题。我认为检查您的类是否可以编译是合适的。单击“重新编译”(默认为 Ctrl+Shift+F9)。如果它不起作用,那么您必须调查它无法编译的原因。

就我而言,代码没有自动编译,因为编译存在隐藏的错误(它们没有显示在任何地方的日志中,并且 maven clean-install 正在工作)。根本原因是项目结构 -> 模块配置不正确,因此 Intellij Idea 无法根据此配置构建它。

2赞 يعقوب 5/4/2020 #18

我遇到了同样的问题,IntelliJ 中也有一个问题文件图标,所以我删除了文件夹并重新导入项目解决了我的问题。.idea

3赞 Aakash Anand 10/10/2021 #19

对于使用新版本但找不到的人Intellijcompiler.automake.allow.when.app.running

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

基本上,该选项现在已移至(选中“允许自动制作”选项)Settings -> Advanced Settings -> Compiler

评论

0赞 gunslingor 9/19/2022
谢谢。。。虽然仍然无法让它工作,但说实时服务器正在运行,但当我更改类字符串时什么也没发生。
3赞 HelpMatters 10/12/2021 #20

对于 Intellij 2021 或更高版本,你将找不到注册表项

compiler.automake.allow.when.app.running

它已移至高级设置,如以下屏幕截图所示

IntelliJ Advanced Settings Screenshot

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