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

Posted

技术标签:

【中文标题】Intellij IDEA Java 类不会在保存时自动编译【英文标题】:Intellij IDEA Java classes not auto compiling on save 【发布时间】:2012-09-26 11:52:33 【问题描述】:

昨天我从 Eclipse 切换到 IntelliJ IDEA。

我也将 JRebel 与 WebSphere Server 7 一起使用。

现在似乎一切正常,除了 当我修改一个 Java 文件并点击保存时,IntelliJ 重新- 编译文件,以便 JRebel 拾取它。

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

在 IntelliJ IDEA 中,我必须按 CTRL+SHIFT+9 来重新编译相关类,以便 JRebel 将其拾取.如果对两个文件进行了更改,我必须对其中一个执行此操作,并且由于 IntelliJ 使用全部保存机制,因此很难知道要重新编译什么手动,我也不是很感兴趣。

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

【问题讨论】:

你为什么不直接按Ctrl+F9?这将构建整个项目,如果仅更改了两个文件,则将重新构建这些文件。 我担心它会重建一切。我相信默认是重建时的清晰输出......所以通常这不会很好...... 它在构建之前清理。这是一个增量构建。如果需要,您还可以选择重建。 看看这个:***.com/questions/19596779/… 【参考方案1】:

更新

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

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

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

对于早于 2021.2 的版本:

使用 Ctrl+Shift+A(或 +Shift+ A 在 Mac 上)在注册表窗口打开后键入 Registry,找到并启用 compiler.automake.allow.when.app.running,请参见此处:


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

有关更多提示,请参阅"Migrating From Eclipse to IntelliJ IDEA" 指南。

【讨论】:

我必须为此安装一个插件,这很烦人。我昨天和今天已经在这上面花了。我希望他们可以为此构建一个选项,我认为 Eclipse 没有此功能的专利,是吗?我也可以重新映射到 CTRL + S 以使其自动保存。我会尝试几个选项。谢谢 这很慢。这太慢了。有很大的改进空间!我不是它在后台所做的,但 Intellij 需要大约 3-4 秒来编译一个类中的一个小改动。即使是“编译'StartController.java'”意味着一个类也只需要3-4秒。 Eclipse 在不到 100 毫秒的时间内完成了这项工作。我将再次测试eclipse模式插件并决定使用什么.. “自动制作项目”仅在不运行/调试时有效 不适用于 Intellij 2017.1.3 和 spring boot devtools。 2020.4 不起作用。嘿,这是我的问题!才发现。大声笑......我想又回到这里了。【参考方案2】:

请遵循两个步骤:

1 - 从编译器启用 Automake

按:ctrl + shift + A(对于 Mac + shift + A) 类型:make project automatically 点击:回车 启用Make Project automatically 功能

2 - 在应用程序运行时启用 Automake

按:ctrl + shift + A(对于 Mac + shift + A) 类型:Registry 找到密钥 compiler.automake.allow.when.app.running启用它点击它旁边的复选框

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

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

【讨论】:

完美,这正是我想要的 =) 这也适用于 spring-boot-devtools 和 IntelliJ IDEA 2016.2.5 对,所以这似乎适用于 IntelliJ 2017.1.3,我使用了选项 2,因为这是 spring boot devtools 所需要的。 运行良好,但在 JRebel 中重新加载需要 4-5 秒。有什么办法吗? 我不认为上面的项目 1 和 2 是“选项”,而是步骤。你需要两者都做。【参考方案3】:

警告

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


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

使用Build | Make,它调用增量生成过程,该过程将只编译更改和依赖的文件(非常快)。

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

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

【讨论】:

是的,我以前见过它,但认为它太慢了,弹出窗口等等。以为是为了别的。我可能会尝试一下,尽管 CTRL + 9 很烦人,但我想我可以重新映射到 CTRL + S 以使其自动保存。 感谢您的更新。我已经安装了 Eclipse 模式插件。没有那个对话框......好吧.. Intellij 12......好吧,你正在改进。 intellij 12 还好吗? 我已经尝试了 12 几天。 use external build -> make 自动不会触发任何操作。没有任何事情发生。当我使用 eclipse 模式插件(从设置中启用/禁用它)工作正常,但是当我禁用 eclipse 模式插件并启用“使用外部构建 - >自动制作”时,编辑和保存没有任何反应......任何想法为什么? @CrazyCoder 我刚回到这个和 jRebel。这太慢了。有很大的改进空间!我不是它在后台所做的,但 Intellij 需要大约 3-4 秒来编译一个类中的一个小改动。即使是“编译'StartController.java'”意味着一个类也只需要3-4秒。 Eclipse 在不到 100 毫秒的时间内完成了这项工作。我将再次测试插件并决定使用什么.. @SecretService 选项卡行为建议在youtrack.jetbrains.com/issues/IDEA 欢迎。已经有几个关于固定标签并阻止它们关闭的未解决问题。【参考方案4】:

您可以通过键盘映射ctrl+s 以一步保存和编译。转到键盘映射设置并搜索Compile

【讨论】:

谢谢,我最喜欢这个! intellij 中的自动编译,还有这个,但至少我现在看到它何时完成,太慢了。 对我不起作用,分配 CTRL+S 进行编译并没有从调试按钮开始重新启动我的服务器 它适用于我,Intellij 2018.2。它应该搜索 Build Project【参考方案5】:

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

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

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

【讨论】:

有一种方法可以改善 IntelliJ 体验:切换到浏览器时保存和编译 Eclipse 能够添加保存操作,因此您还可以在保存时执行诸如组织导入和格式化代码之类的操作。手动执行所有这些操作会增加大量击键次数,并使该过程更容易出错。例如,如果您在 Eclipse 中保存时格式化,则永远不会有未格式化的代码。在 IntelliJ 中很容易忘记格式化。 @Max,IntelliJ 在提交期间运行这些操作(根据我个人的喜好,这是最好的时刻)。在某些情况下,它还会直接在编辑器中突出显示编码风格问题(例如 Python 的 PEP8 一致性)。 习惯一个 IDE 为我做而另一个不做的事情,让我的生活更加困难,这不是一个好的卖点。 @Jonathan 提高可用性通常需要放弃旧的,通常是不必要的用户习惯。【参考方案6】:

我最终录制了一个,以便一步保存和编译,并将Ctrl+s 映射到它。

【讨论】:

@SecretService 可能不适用于所有人,因为当多个操作映射到同一个快捷方式时,操作顺序未定义。【参考方案7】:

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

我开始录制宏:

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

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

现在只需删除 Save all 键绑定,并将相同的键绑定添加到您的宏!

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

【讨论】:

建议给宏一个不同的键绑定而不是替换现有的全部保存 - 但这同样是主观的。 谢谢。由于普通的“构建”(如其他答案所建议的那样)对我来说甚至还不够,所以我每次都使用此解决方案来保存 + 重建。让我回到 Eclipse 的感觉,即使它消耗大量资源......【参考方案8】:

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

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) 运行您的应用,即时更改您的课程

请作为 cmets 报告您对此问题的经验和问题。

click here for more info

【讨论】:

它仍被标记为“进行中”,对我不起作用。【参考方案9】:

在我的 Maven 项目中受此影响的唯一对我有用的是在我的单元测试的运行配置中添加一个“测试编译”目标。非常笨拙的解决方案,但它确实有效。

【讨论】:

至少它可以工作 :D 但是是的,最好找到这个问题的根源【参考方案10】:

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

【讨论】:

【参考方案11】:

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

【讨论】:

【参考方案12】:

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

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

基本上该选项现在已移至Settings -> Advanced Settings -> Compiler(选中允许自动生成选项)

【讨论】:

【参考方案13】:

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

【讨论】:

我不知道为什么这个答案被否决了,它也回答了这个问题,对我来说是一样的 - “省电模式”,虽然它写在设置中,但启用自动编译不起作用。 【参考方案14】:

使用 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());

【讨论】:

为什么会有人下载一些随机代码并运行它? @Drew:刚刚上传到 Jetbrains 进行审核。但是,如果您偏执,我想您可以等待几天才能从那里获得... sbmpost,我只是指出为什么有些人会(不是我这样做)投反对票,标记为 Not An Answer,然后将其删除。 如果是代码,您可以以文本形式发布,那就太好了。你可以吗?这是一个代码站点。 @drew:添加了关于 jar 的注释并为代码添加了更多上下文。它可能看起来很高级,但如果您从 FileDocumentManagerAdapter 扩展并添加代码,您将(几乎)拥有一个可编译的 ReformatAndCompile 类。【参考方案15】:

编辑您的运行/调试配置,以便在启动前选择构建选项

选择构建选项后

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

【讨论】:

这很好,但问题是在保存时自动编译,无需使用自定义命令再次显式编译,然后再执行诸如运行测试等操作,【参考方案16】:

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

我不知道结果如何,但删除它解决了问题。

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

例如: 见

中的模块

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

【讨论】:

【参考方案17】:

我有同样的问题。我认为检查您的课程是否可以编译是合适的。单击重新编译(默认为 Ctrl+Shift+F9)。如果它不工作,那么你必须调查它为什么不编译。

在我的情况下,代码没有自动编译,因为编译时存在隐藏错误(它们没有显示在任何地方的日志中,并且 maven clean-install 正在工作)。根本原因是 Project Structure -> Modules 配置不正确,因此 Intellij Idea 无法根据此配置构建它。

【讨论】:

【参考方案18】:

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

compiler.automake.allow.when.app.running

如下图所示已移至高级设置

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

【讨论】:

【参考方案19】:

我收到错误:一些 jars 不在类路径中。所以我只删除损坏的 jar 并执行以下步骤

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

【讨论】:

【参考方案20】:

没有足够的点来评论现有答案,但与上面的某些人类似,我最后只是添加了一个宏和键盘映射到 组织导入/格式化/SaveAll/FastReload(F9)/Synchronize .

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

这个过程比 eclipse 慢——而且对于外部文件刷新通常需要多次运行该命令——但假设我可以忍受它。

【讨论】:

以上是关于Intellij IDEA Java 类不会在保存时自动编译的主要内容,如果未能解决你的问题,请参考以下文章

IntelliJ IDEA 基本配置入门

IntelliJ IDEA - Java类闪电符号意义

IntelliJ IDEA中Java类注释

IntelliJ IDEA 创建 Java包

类'java.io.'在JRE仿真库INTELLIJ IDEA中不存在

IntelliJ IDEA部署项目常见问题总结原因及解决方法(持续更新……)