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

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

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

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

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

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

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

Ответ 1

ОБНОВЛЕНО

Для выпусков IntelliJ IDEA 12+ мы можем автоматически создавать отредактированные источники, если мы используем опцию внешнего компилятора. Нужно только проверить опцию "Автоматически строить проект", расположенную в настройках "Компилятора":

Compiler Settings

Кроме того, если вы хотите выполнить горячее развертывание во время работы приложения или если вы используете весеннюю загрузку 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 автоматически компилировала сохраненные файлы.

Дополнительные советы см. В руководстве "Переход от Eclipse к IntelliJ IDEA".

Ответ 2

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

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

  • Нажмите: ctrl + shift + A (для Mac + shift + A)
  • Тип: make project automatically
  • Хит: Enter
  • Включить функцию Make Project automatically

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

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

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

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

Ответ 3

ВНИМАНИЕ!

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


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

Make project automatically

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

Существует также часто задаваемый вопрос, который может помочь.

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

Ответ 4

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

Ответ 5

В итоге я записал Макрос, чтобы сохранить и скомпилировать за один шаг, а также с помощью клавиатуры Ctrl+s.

Ответ 6

Фактически без разницы, поскольку для этого требуется 1 клик:

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

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

Ответ 7

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

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

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

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

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

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

Ответ 8

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

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

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

3) включить фоновую компиляцию в Settings-> Build, Execution, Deployment-> Компилятор "Создать проект автоматически"

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

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

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

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

Ответ 9

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

введите описание изображения здесь

Ответ 10

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

Ответ 11

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

Ответ 12

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

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

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

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

enter image description here

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

enter image description here

Ответ 13

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

Ответ 14

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

enter image description here

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

enter image description here

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

Ответ 15

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

Ответ 16

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

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

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