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

Вчера я перешел на Intellij из Eclipse.

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

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

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

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

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

20 ответов

Решение

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

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


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

Пожалуйста, следуйте обоим шагам:

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

  • Нажмите: Ctrl + Shift + A (для Mac + Shift + A)
  • Тип: make project automatically
  • Hit: Enter
  • включить Make Project automatically особенность

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

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

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

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

ПРЕДУПРЕЖДЕНИЕ

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


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

Сделать проект автоматически

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

Существует также запись FAQ, которая может помочь.

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

Вы можете раскладывать ctrl+s сохранить и скомпилировать за один шаг. Зайдите в настройки раскладки клавиатуры и найдите Compile,

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

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

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

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

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

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

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

Назовите это что-нибудь полезное, например, "SaveAndMake".

Теперь просто удалите привязку "Сохранить все" и добавьте такую ​​же привязку к макросу!

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

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

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

2) вызовите Help->Find Action... и введите "Registry", в диалоговом окне найдите "automake" и включите запись "compiler.automake.allow.when.app.running", закройте диалог

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

4) откройте конфигурацию запуска Spring Boot, вы должны получить предупреждение, если все настроено правильно

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

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

Нажмите здесь для дополнительной информации

Для Intellij 2021 или новее вы не найдете запись в реестре

compiler.automake.allow.when.app.running

Он был перемещен в расширенные настройки, как показано на скриншоте ниже.

Источник: https://youtrack.jetbrains.com/issue/IDEA-274903

Для людей, использующих новый Intellij версия и не могу найти compiler.automake.allow.when.app.running

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

В основном опция теперь переехала в Settings -> Advanced Settings -> Compiler (Установите флажок Разрешить автоматическое создание)

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

Я имел такой же вопрос, а также значок проблемы файл в IntelliJ, поэтому я удалил.idea папка и проект повторного импорта решили мою проблему.

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

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

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

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

После сборки выбран вариант

Вышеупомянутое решение помогло мне, работая над моим набором тестов JBehave.

Он не работал для меня из-за наличия ненужного модуля в структуре моего проекта. Тесты были выполнены с использованием другого модуля, я полагаю.

Я не знаю, как это закончилось, но удаление проблемы решило проблему.

Убедитесь, что ваши настройки Run/Debug используют модуль, который вы строите с автосохранением.

Например: см. Модуль в

Вы можете изменить модули в Структуре проекта - Модули

Я была такая же проблема. Думаю, было бы уместно проверить, компилируется ли ваш класс или нет. Нажмите "Перекомпилировать" (по умолчанию Ctrl+Shift+F9). Если он не работает, вам нужно выяснить, почему он не компилируется.

В моем случае код не компилировался автоматически, потому что при компиляции были скрытые ошибки (они нигде не отображались в журналах, и maven clean-install работала). Основной причиной была неправильная структура проекта -> конфигурация модулей, поэтому Intellij Idea не смогла построить его в соответствии с этой конфигурацией.

Я получаю сообщение об ошибке: некоторые файлы отсутствуют в 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

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

Синхронизация добавлена, так как кажется, что я могу видеть обновления ресурсов, измененных внешними инструментами / наблюдателями (т. Е. Веб-пакетом).

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

Другие вопросы по тегам