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


182

昨天我从Eclipse切换到IntelliJ IDEA。

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

现在,一切似乎都可以正常工作,除了当我修改 Java文件并单击save时,IntelliJ 不会重新编译该文件,以便JRebel进行拾取。

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

在IntelliJ IDEA中,我必须点击CTRL+ SHIFT+ 9以重新编译相关的类,以供JRebel使用。如果对两个文件进行了更改,我有对每个并且由于IntelliJ使用了全部保存机制,因此很难知道要手动重新编译的内容,而我对这样做都不感兴趣。

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


11
为什么不按Ctrl+ 键F9呢?这将构建整个项目,如果仅更改了两个文件,则将对其进行重建。
maba 2012年

2
我担心它将全部重建。我相信默认值是在重建时输出清晰的信息,因此通常情况下效果不佳...
mmm 2012年

5
它并没有构建之前清理。这是一个增量构建。如果需要,您还有另一种选择来重建。
maba 2012年

Answers:


250

更新

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

Compiler Settings

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

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

enter image description here


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

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


10
感到烦恼的是我必须为此安装一个插件。我已经在昨天和今天花了这个时间。我希望他们可以为此提供一个选项,我不认为Eclipse在此功能上拥有专利,对吗?我还可以将其重新映射到CTRL + S,使其自动保存。我将尝试几种选择。感谢
mmm 2012年

14
太慢了 这太慢了。有很大的改进空间!我不是它在后台执行的操作,但是在一个单独的类中编译一个小的更改大约需要3-4秒Intellij。即使是“ Compile'StartController.java'”,也意味着一个类只需要3-4秒。Eclipse在不到100毫秒的时间内完成了此操作。我将测试日食模式再次插件,并决定以去的..

34
“自动生成项目”仅在未运行/调试时有效
xenoterracide 2014年

8
不适用于Intellij 2017.1.3和spring boot devtools。
Nico de Wet

1
不要使用IntelliJ IDEA 2017.3.3,Java 9.0.4,Spring Boot 2.0.0.RC1,Spring devtools :(
Do Nhu Vy

75

请按照两个步骤:

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

  • 按:ctrl+ shift+ A(对于Mac + shift+A
  • 类型: make project automatically
  • 击中: Enter
  • 启用Make Project automatically功能

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

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

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

注意:这还应允许使用Spring Boot devtools实时重新加载。


2
完美,这正是我想要的=)
eitch 16-10-14

3
这也适用于spring-boot-devtools和IntelliJ IDEA 2016.2.5
Xaero Degreaz 16-10-19

2
是的,所以这似乎可以在IntelliJ 2017.1.3上使用,我使用了选项2,因为这是Spring Boot devtools所需要的。
Nico de Wet

1
效果很好,但是重新加载JRebel需要4-5秒。可以解决吗?
user3184974

1
我认为上面的项目1和2不是“选项”,而是步骤。您需要同时做。
托马斯·卡莱尔

67

警告

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


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

自动制作项目

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

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

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


是的,我以前看过它,但是由于弹出窗口和所有内容太慢而忽略了它。以为是别的东西。我可能会尝试给CTRL + 9烦人,但是我想我可以重新映射到CTRL + S来制作,因为它会自动保存。
mmm 2012年

感谢更新。我已经安装了Eclipse Mode插件。没有该对话框...好的.. Intellij 12 ...好吧,您正在改进。是IntelliJ 12均匀吗?
mmm 2012年

3
我已经尝试了12天了几天。自动使用外部构建-> make不会执行任何操作。没事。当我使用eclipse模式插件(从设置中启用/禁用它)可以正常工作时,但是当我禁用eclipse模式插件并启用“使用外部构建->自动制作”时,编辑和保存都不会发生任何事情……为什么?
mmm 2012年

2
@CrazyCoder我刚回到这和jRebel。这太慢了。有很大的改进空间!我不是它在后台执行的操作,但是在一个单独的类中编译一个小的更改大约需要3-4秒Intellij。即使是“ Compile'StartController.java'”,也意味着一个类只需要3-4秒。Eclipse在不到100毫秒的时间内完成了此操作。我将再次测试该插件,并决定以去的..

1
欢迎访问@SecretService选项卡的行为建议,网址youtrack.jetbrains.com/issues/IDEA。关于固定选项卡并阻止它们关闭,已经存在一些未解决的问题。
CrazyCoder 2014年

38

您可以ctrl+s一步一步地保存和编译键盘映射。进入键盘映射设置并搜索Compile


3
谢谢,我最喜欢这个!intellij中的自动编译也是如此,但至少我现在看到它何时完成,速度太慢。
mmm 2014年

不适用于我,分配CTRL + S进行编译未通过调试按钮重新启动服务器
Dimitri Kopriwa

它对我有效,Intellij 2018.2。它应搜索Build Project
Neo Pham

18

实际上没有区别,因为两者都需要单击一下:

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

最简单的解决方案就是习惯它。因为当您大部分时间都在IDE中度过时,与一种慢习惯相比,更好的是一种快习惯。


2
有改善IntelliJ体验的方法:切换到浏览器时保存和编译
ruX 2015年

Eclipse可以添加保存操作,因此您还可以执行一些操作,例如组织导入并在保存时格式化代码。手动执行所有这些操作会增加大量的击键,并使过程更容易出错。例如,如果在Eclipse中保存时进行格式化,则永远不会拥有未格式化的代码。忘记IntelliJ中的格式非常容易。
Max

1
@ Max,IntelliJ在提交期间运行这些操作(根据我个人的喜好,这是最好的时刻)。在某些情况下,它还会直接在编辑器中突出显示编码样式问题(例如python的PEP8一致性)。
andruso

2
习惯一个IDE为我做而另一个IDE不为我做的事情,这使我的生活更加困难,这不是一个好卖点。
乔纳森

1
@Jonathan经常要提高可用性,这需要放弃用户的旧习惯(通常是不必要的习惯)。
andruso

17

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


5
@SecretService可能不适用于所有人,因为当多个操作映射到同一快捷方式时,操作顺序未定义。
Celos

13

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

我开始记录宏:

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

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

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

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


建议给宏一个不同的键绑定,而不是替换现有的全部保存-但这只是主观的。
arcseldon '16

谢谢。由于正常的“构建”(由其他答案建议)对我来说甚至还不够,因此我每次都使用此解决方案进行保存和重建。即使消耗大量资源,也能带给我Eclipse的感觉……
Boris

5

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

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

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

3)在“设置”->“生成,执行,部署”->“自动创建项目”编译器中启用后台编译

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

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

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

请点击这里获取更多信息


它被标记为仍在进行中,对我不起作用。
JGarrido '02

2

受此影响的对我的Maven项目唯一有效的方法是在单元测试的运行配置中添加“测试-编译”目标。笨拙的解决方案,但是行得通。

在此处输入图片说明


至少它可以工作:D但是,是的,最好找到这个问题的根源
anindis

2

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


1

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


Idont不知道为什么这个答案会被拒绝,它也回答了这个问题,对我来说是一样的-“省电模式”,尽管它是在设置中编写的,但是启用了此功能后,自动编译将不起作用。
Nerius Jok

1

使用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:刚刚将其上传到Jetbrains进行审查。但是,如果您偏执狂,我想您可以等待几天,然后再从那里获得...
sbmpost

sbmpost,我只是指出为什么有些人(不是我这样做)会投票,将其标记为“无人回答”,然后删除此内容。
提请

如果是代码,则可以以文本形式发布,那很棒。你能?这是一个代码站点。
提请

1
@drew:添加了有关jar的注释,并在代码中添加了更多上下文。它可能看起来很高级,但是如果您从FileDocumentManagerAdapter扩展并添加代码,则(几乎)将有一个编译的ReformatAndCompile类。
sbmpost '16

1

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

在此处输入图片说明

选择生成选项后

在此处输入图片说明

上述解决方案对我的JBehave测试套件有效


很好,但是问题是保存时自动编译,而无需执行自定义命令就再次进行显式编译,然后再执行诸如运行测试等操作,
kisna,

1

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

我不知道它怎么会这样,但是删除它可以解决问题。

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

例如:请参阅中的模块

在此处输入图片说明

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

在此处输入图片说明


1

我遇到过同样的问题。我认为检查您的类是否可以编译是适当的。单击重新编译(默认情况下为Ctrl + Shift + F9)。如果它不起作用,那么您必须调查为什么它不能编译。

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


1

我遇到了同样的问题,并且在intellij中也有问题文件图标,因此我删除了该.idea文件夹并重新导入项目解决了我的问题。


0

我收到错误消息:有些jar不在classpath中,所以我只删除损坏的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

-1

没有足够的意见来评论现有答案,但是与上述某些人类似,我只想添加一个宏和键映射来组织Imports / Format / SaveAll / FastReload(F9)/ Synchronize

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.