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


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

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

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

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

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

разве нет способа сделать Intellij сделай это сам?

15 138

15 ответов:

обновлено
Для IDEA 12 + releases мы можем автоматически создавать отредактированные источники, если мы используем параметр внешнего компилятора. Единственное, что нужно, это проверить опцию "построить проект автоматически", расположенную в настройках компилятора. 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, чтобы заставить IDEA автоматически компилировать сохраненные файлы. Видеть: https://www.jetbrains.com/help/idea/2016.3/eclipse.html для получения дополнительных советов при миграции из Eclipse.

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

1-включить автоматическое создание из компилятора

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

2-включить Automake, когда приложение работает

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

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

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

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

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


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

Make project automatically

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

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

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

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

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

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

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

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

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

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

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

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

теперь просто удалить сохранения всех клавиш, и добавьте такое же сочетание клавиш для макроса!

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

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

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

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

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

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

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

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

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

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

enter image description here

используйте плагин переформатирования и компиляции (вдохновленный плагином Save Actions от Alexandre DuBreuil):

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.So я просто удаляю поврежденную банку и 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

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

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

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

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