Классы Java Intellij IDEA не автоматически компилируются при сохранении

вчера я переключился на Intellij из Eclipse.

Я также использую jRebel с Websphere Server 7.

все теперь, кажется, работает несколько нормально, за исключением этого когда я изменить файл Java, и нажмите Сохранить, Intellij не повторно скомпилируйте файл, чтобы jRebel мог его забрать.

затмения " Build Автоматически" функция решила эту проблему.

В Intellij, Я должен ударить CTRL + SHIFT + 9 перекомпилировать соответствующего класса для jRebel, чтобы забрать его. Если изменения сделаны через два файла, Я чтобы сделать это на каждом из их, и поскольку Intellij использует механизм сохранения всех, довольно сложно узнать, что перекомпилировать вручную,что я тоже не заинтересован делать.

нет ли способа сделать Intellij сделайте это самостоятельно?

15 ответов


обновлено
Для версий IDEA 12+ мы можем автоматически создавать отредактированные источники, если мы используем параметр внешнего компилятора. Единственное, что нужно, это проверить опцию "построить проект автоматически", расположенную в настройках компилятора. Compiler Settings Кроме того, если вы хотите горячее развертывание, пока приложение работает или если вы используете spring boot devtools, вы должны включить compiler.automake.allow.when.app.running из реестра. Это автоматически скомпилирует ваш изменения.

используя ctrl+shift+A (или +shift+A на mac) введите Registry Как только окна реестра открыты, найдите и включите compiler.automake.allow.when.app.running см. здесь: enter image description here


Для версий старше 12 вы можете использовать плагин EclipseMode, чтобы идея автоматически компилировала сохраненные файлы. Видеть: https://www.jetbrains.com/help/idea/2016.3/eclipse.html дополнительные советы при переходе из Eclipse.

пожалуйста, выполните оба шага:

1-Включить Automake из компилятора

  • нажмите: ctrl + shift + A (Для Mac + shift + A)
  • тип: make project automatically
  • нажмите: Enter
  • включить Make Project automatically характеристика

2-включить Automake, когда приложение бег!--7-->
  • нажмите: ctrl + shift + A (Для Mac + shift + A)
  • тип: Registry
  • найти ключ compiler.automake.allow.when.app.running и включить или установите флажок рядом с

Примечание: перезапустите приложение сейчас:)

Примечание: это также должно позволить перезагрузить с spring boot инструменты разработчика.


предупреждение

Режим Затмения плагин устарел и не совместим с недавней идеей 12+ сборки. Если вы установите его, IDE будет зависать при каждом изменении файла и будет реагировать очень медленно.


IntelliJ IDEA не использует автоматическую сборку, он обнаруживает ошибки на лету, а не через компилятор. Похожие на Eclipse mode будут доступны в идея 12:

Make project automatically

использовать Build | Make, это вызывает инкрементный процесс make, который будет компилировать только измененные и зависимые файлы (это очень быстро).

также FAQ запись что может помочь.

обновление функции автоматического создания: Когда выполняется конфигурация run/debug, Make project automatically не имеет никакого эффекта. Классы на диске будут меняться только на Build | Make. Это основное дизайнерское решение, поскольку, по нашему мнению, изменения класса на диске всегда должны находиться под контролем пользователя. Автоматический сделать это не подражатель функции Eclipse, он работает по-другому, и его основная цель-сэкономить время, ожидая, когда классы будут готовы, когда они действительно нужны (перед запуском приложения или тестов). Автоматический make не заменяет явную компиляцию, которую вам все еще нужно вызвать, как в случае, описанном в этом вопросе. Если вы ищете другое поведение, плагин EclipseMode, связанный в FAQ выше, был бы лучшим выбором.


вы можете keymap ctrl+s для сохранения и компиляции в один шаг. Перейдите в настройки keymap и найдите Compile.


Я закончил запись макрос для сохранения и компиляции в один шаг, и keymap Ctrl+s к нему.


есть на самом деле без разницы как оба требуют 1 клик:

  • затмение: ручное сохранение, автоматическая компиляция.
  • IntelliJ: автоматическое сохранение, ручная компиляция.

простое решение просто, чтобы привыкнуть к этому. Потому что, когда вы проводите большую часть дня в своей среде IDE, лучше иметь быстрые привычки в одном, чем медленные привычки в нескольких из них.


мне удалось решить эту проблему с помощью макросов.

Я начал записывать макрос:

  • нажмите Edit-Macros-начать запись макросов
  • Нажмите Файл-Сохранить Все
  • Нажмите Build-Make Project
  • нажмите Edit-Macros-остановить запись макросов

назовите это что-то полезное, например, "SaveAndMake".

теперь просто удалите Save all keybinding и добавьте ту же привязку к макро!

Так теперь каждый раз, когда я сохраняю, он сохраняет и делает грязную компиляцию, и jRebel теперь обнаруживает все изменения правильно.


пожалуйста, выполните эти шаги тщательно, чтобы включить его.

1) создайте проект Spring Boot с SB V1.3 и добавьте "Devtools" (1*) в зависимости

2) Вызов справки-> "найти"... и введите "реестр", в диалоговом окне найдите" automake "и включите запись"компилятора.сожалению.позволять.когда.приложение.бег!--8-->", закройте диалоговое окно

3) включить фоновую компиляцию в настройках - >сборка, выполнение, развертывание - >компилятор " сделать проект автоматически"

4) Откройте Spring Boot run config, вы должны получить предупреждающее сообщение, если все настроено правильно

5) запустите приложение, измените свои классы на лету

пожалуйста, сообщите о своем опыте и проблемах в качестве комментариев к этой проблеме.

кликните здесь для получения дополнительной информации


единственное, что сработало для меня в моем проекте maven, на который это повлияло,-это добавить цель "тест-компиляция" в конфигурацию запуска моих модульных тестов. Невероятно неуклюжее решение, но оно работает.

enter image description here


используйте плагин переформатирования и компиляции (вдохновленный плагином 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());
}

Intellij терпит неудачу тихо, когда он сталкивается с проблемой компиляции в другом модуле, а затем автоматическая сборка не выполняется. Так что проверьте свой Problems окно


Я получал ошибку: некоторые банки не находятся в classpath.Поэтому я просто удаляю поврежденную банку и 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

измените конфигурацию запуска / отладки, чтобы перед запуском была выбрана опция сборки

enter image description here

после выбора опции сборки

enter image description here

вышеуказанное решение работало для меня во время работы над моим JBehave Test suite


У меня была та же проблема. Я использовал "режим энергосбережения", который предотвращает компиляцию постепенно и показывает ошибки компиляции.


недостаточно очков, чтобы прокомментировать существующий ответ, но, как и некоторые люди выше, я закончил просто добавив макрос & keymap в Организовать Импорт / Формат / SaveAll / FastReload(F9) / Синхронизировать.

синхронизация добавлена, поскольку это единственный способ, которым я также могу видеть обновления в ресурсах, измененных внешними инструментами сборки / наблюдателями (т. е. webpack).

процесс медленнее, чем eclipse - и для обновления внешнего файла часто приходится запускать команда несколько раз - но предположим, я смогу жить с ней.