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


182

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

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

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

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

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

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


11
Почему бы тебе просто не нажать Ctrl+ F9? Это создаст весь проект, и если будут изменены только два файла, они будут перестроены.
Маб

2
Я боялся, что это восстановит все. Я считаю, что по умолчанию это чистый вывод при перестроении ... так что обычно это не работает хорошо ...
ммм

5
Он не очищает перед сборкой. Это инкрементная сборка. У вас есть другой выбор, чтобы восстановить, если хотите.
Маб

Ответы:


251

ОБНОВЛЕНО

Для выпусков IntelliJ 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 автоматически компилировала сохраненные файлы.

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


10
Меня раздражает, что я должен установить плагин для этого. Я уже вчера и сегодня потратил на это. Я хотел бы, чтобы они могли просто встроить опцию для этого, я не думаю, что у Eclipse есть патент на эту функцию, не так ли? Я также мог бы переназначить CTRL + S, чтобы сделать, поскольку это автоматически сохраняет. Я попробую пару вариантов. спасибо
ммм

14
Это медленно. Это слишком медленно. Есть много возможностей для совершенствования! Я не то, что делает в фоновом режиме, но Intellij требуется около 3-4 секунд, чтобы скомпилировать одно небольшое изменение в одном классе. Даже «Compile 'StartController.java'», означающий, что один класс занимает всего 3-4 секунды. Eclipse делает это менее чем за 100 миллисекунд. Я снова протестирую плагин режима затмения и решу, с чем идти ..
ммм


8
У меня не работает Intellij 2017.1.3 и devtools с весенней загрузкой.
Нико де

1
Не работайте с IntelliJ IDEA 2017.3.3, Java 9.0.4, Spring Boot 2.0.0.RC1, Spring devtools :(
Делайте Nhu Vy

75

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

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 с пружинной загрузкой.


2
Отлично, это было именно то, что я искал =)
Eitch

3
Это также работало для меня с spring-boot-devtools и IntelliJ IDEA 2016.2.5
Xaero Degreaz

2
Итак, похоже, что это работает на IntelliJ 2017.1.3, я использовал вариант 2, так как это то, что нужно для devtools с весенней загрузкой.
Нико де

1
Работало хорошо, но для перезагрузки в JRebel требуется 4-5 секунд. Любой способ обойти это?
user3184974

1
Я не думаю, что пункты 1 и 2 выше - это «варианты», но это шаги. Вы должны сделать оба.
Томас Карлайл

67

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

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


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

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

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

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

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


Да, я видел это раньше, но отклонил это как слишком медленное, с всплывающим окном и всем. Думал, что это было для чего-то другого. Я мог бы попробовать, хотя CTRL + 9 раздражает, но я думаю, что я мог бы переназначить CTRL + S, чтобы сделать, поскольку это автоматически сохраняет.
ммм

Спасибо за обновление. Я установил плагин Eclipse Mode. У меня нет этого диалога ... Ook .. Intellij 12 ... хорошо, хорошо, что вы улучшаете. Intellij 12 выровнялся?
ммм

3
Я пробовал 12 в течение нескольких дней. Использование external build -> make автоматически не запускает никаких действий. Ничего счастливого. Когда я использую плагин режима eclipse (включаю / выключаю его из настроек), он работает нормально, но когда я отключаю плагин режима eclipse и включаю «использовать внешнюю сборку -> автоматическое создание», ничего не происходит при редактировании и сохранении ... любая идея Зачем?
ммм

2
@CrazyCoder Я только что вернулся к этому и jRebel. Это слишком медленно. Существует много возможностей для улучшения! Я не то, что делает в фоновом режиме, но Intellij требуется около 3-4 секунд, чтобы скомпилировать одно небольшое изменение в одном классе. Даже «Compile 'StartController.java'», означающий, что один класс занимает всего 3-4 секунды. Eclipse делает это менее чем за 100 миллисекунд. Я снова протестирую плагин и решу, с чем идти ..
ммм

1
Предложения по поведению на вкладке @SecretService приветствуются на youtrack.jetbrains.com/issues/IDEA . Уже есть несколько открытых вопросов о закрепленных вкладках и предотвращении их закрытия.
CrazyCoder

38

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


3
Спасибо, мне это нравится больше всего! Автоматическая компиляция в intellij, и эта тоже, но, по крайней мере, я вижу, когда она заканчивается сейчас, слишком медленная.
ммм

У меня не сработало, назначение CTRL + S для компиляции не перезапустило мой запуск сервера с помощью кнопки отладки
Dimitri Kopriwa

Это работает для меня, Intellij 2018.2. Нужно искать проект строительства
Нео Фам,

18

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

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

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


2
Есть способ улучшить работу с IntelliJ: сохранять и компилировать при переключении в браузер
ruX

Eclipse имеет возможность добавлять действия сохранения, вы также можете делать такие вещи, как организация импорта и форматирование кода при сохранении. Выполнение всех этих действий вручную добавляет значительное количество нажатий клавиш и делает процесс более подверженным ошибкам. Например, вы никогда не сможете получить неотформатированный код, если отформатируете при сохранении в Eclipse. Очень легко забыть форматирование в IntelliJ.
Макс

1
@Max, IntelliJ выполняет эти действия во время коммита (что, на мой взгляд, лучший момент). В некоторых случаях это также подчеркивает проблемы стиля кодирования непосредственно в редакторе (например, соответствие PEP8 для python).
Андрусо

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

1
@ Джонатан для улучшения юзабилити очень часто требует отказа от старых, часто ненужных, привычек для пользователей.
Андрусо

17

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


5
@SecretService Может работать не для всех, так как порядок действий не определяется, когда несколько действий отображаются на один ярлык.
Celos

13

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

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

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

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

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

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


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

Спасибо. Так как обычного «Сборка» (как подсказывают другие ответы) для меня даже недостаточно, я использую это решение для сохранения + перестройки каждый раз. Возвращает мне чувство Затмения, даже если оно потребляет много ресурсов ...
Борис

5

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

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

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

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

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

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

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

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


Он помечен как «В процессе» и не работает для меня.
JGarrido

2

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

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


по крайней мере, это работает: D, но да, лучше найти источник этой проблемы
Anindis

2

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


1

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


Я не знаю, почему этот ответ имеет отрицательное значение, он также отвечает на вопрос, для меня было то же самое - «Режим энергосбережения», хотя его написал в настройках, но с этим включен автокомпиляция не работает.
Нериус Джок

1

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

2
Зачем кому-то скачивать какой-нибудь случайный код и запускать его?
Дрю

@Drew: Просто загрузил его в Jetbrains для обзора. Но если вы параноик, я полагаю, вы могли бы подождать несколько дней, прежде чем он будет доступен оттуда ...
sbmpost

sbmpost, я просто указываю, почему некоторые (не то, что я сделал) понижают голос, отмечают как Не Ответ, и удаляют это.
Дрю

Если это код, который вы можете разместить в тексте, это здорово. Ты можешь? Это код сайта.
Дрю

1
@drew: добавлено примечание о банке и добавлено немного больше контекста в код. Это может показаться высоким уровнем, но если вы расширите FileDocumentManagerAdapter и добавите код, у вас (почти) будет скомпилированный класс ReformatAndCompile.
sbmpost

1

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

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

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

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

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


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

1

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

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

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

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

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

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

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


1

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

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


1

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


0

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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.