Класи Java Intellij IDEA не зберігаються автоматично при збереженні


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
Перед очищенням не очищається. Це додаткове нарощування. У вас є ще один вибір, за бажанням відновити.
маба

Відповіді:


250

ОНОВЛЕНО

Для випусків 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 автоматично компілювала збережені файли.

Для отримання додаткових порад див посібник "Міграція із затемнення на IntelliJ IDEA" .


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

14
Це повільно. Це занадто повільно. Є багато можливостей для вдосконалення! Я не те, що робить це у фоновому режимі, але для отримання Intellij потрібно 3-4 секунди, щоб зібрати одну невелику зміну в одному класі. Навіть "Компілювати" StartController.java "", що означає, що один клас займає лише 3-4 секунди. Eclipse робить це менш ніж за 100 мілісекунд. Я ще раз випробую плагін режиму затемнення і вирішу, з чим піти ..
mmm

34
"Зробити проект автоматично" працює лише під час не запуску / налагодження
xenoterracide

8
Не працює для мене з Intellij 2017.1.3 та розробниками для весняного завантаження.
Ніко де Мокрий

1
Не працюйте з IntelliJ IDEA 2017.3.3, Java 9.0.4, Spring Boot 2.0.0.RC1, Spring devtools :(
Do Nhu Vy

75

Будь ласка, виконайте обидва кроки:

1 - Увімкнути Автоматичне виконання з компілятора

  • Натисніть: ctrl+ shift+ A(для Mac + shift+ A)
  • Тип: make project automatically
  • Попадання: Enter
  • Увімкнути Make Project automaticallyфункцію

2 - Увімкнути Автоматичне виконання під час роботи програми

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

Примітка. Перезавантажте програму зараз :)

Примітка. Це також повинно дозволити перезавантажити в реальному часі з весняними розробниками.


2
Ідеально, це було саме те, що я шукав =)
eitch

3
Це також працювало для мене з Spring-boot-devtools та IntelliJ IDEA 2016.2.5
Xaero Degreaz

2
Правильно, тому, здається, це працює на IntelliJ 2017.1.3, я використовував варіант 2, оскільки саме це потрібно весняним завантажувальним розробникам.
Ніко де Мокрий

1
Працював добре, але для завантаження в JRebel потрібно 4-5 секунд. Як-небудь навколо цього?
користувач3184974

1
Я не думаю, що пункти 1 і 2 вище - це "варіанти", але це кроки. Вам потрібно зробити і те, і інше.
Томас Карлайл

67

УВАГА

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


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

Зробіть проект автоматично

Використовувати Build|Make, він викликає поступовий процес створення, який збиратиме лише змінені та залежні файли (це дуже швидко).

Також є запис, що може допомогти.

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


Так, я бачив це і раніше, але відхилив це як занадто повільний, із спливаючим меню і всіма. Думав, що це щось інше. Я можу спробувати althoguh CTRL + 9 дратує, але я думаю, що я міг би перезавантажити CTRL + S, щоб зробити так, як це автоматично зберігається.
ммм

Дякуємо за оновлення. Я встановив плагін Eclipse Mode. Не майте цього діалогу ... Ой .. Intellij 12 ... ну добре, що ви вдосконалюєтесь. Чи Intellij 12 рівний?
ммм

3
Я випробовував 12 протягом пари. Використання зовнішньої збірки -> make автоматично не викликає жодної дії. Нічого не радіє. Коли я використовую плагін режиму затемнення (увімкніть / вимкніть його з налаштувань), він працює добре, але коли я відключаю плагін режиму затемнення і включаю "використовувати зовнішню збірку -> автоматично зробити", нічого не відбувається при редагуванні та збереженні ... чому?
ммм

2
@CrazyCoder Я просто повернувся до цього і jRebel. Це занадто повільно. Є багато можливостей для вдосконалення! Я не те, що робить це у фоновому режимі, але для отримання Intellij потрібно 3-4 секунди, щоб зібрати одну невелику зміну в одному класі. Навіть "Компілювати" StartController.java "", що означає, що один клас займає лише 3-4 секунди. Eclipse робить це менш ніж за 100 мілісекунд. Я ще раз випробую плагін і вирішу, з чим піти ..
mmm

1
Пропозиції щодо поведінки на вкладці @SecretService вітаються на youtrack.jetbrains.com/isissue/IDEA . Про закріплені вкладки та запобігання їх закриттю вже існує декілька відкритих питань.
CrazyCoder

38

Ви можете ctrl+sстворити клавішну карту, щоб зберегти І компілювати за один крок Перейдіть до налаштувань клавіатури та знайдіть Compile.


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

Не працювало для мене, призначаючи CTRL + S для компіляції, не перезапускав сервер, починаючи з кнопки налагодження
Dimitri Kopriwa

Це працює для мене, Intellij 2018.2. Слід знайти проект Build
Neo Pham

18

Насправді різниці немає, оскільки обом потрібен 1 клік:

  • Eclipse : вручну Зберегти, автоматично складати.
  • IntelliJ : автоматичне збереження, компіляція вручну.

Найпростіше рішення - просто звикнути до нього. Тому що, коли ви проводите більшу частину дня в своєму IDE, тоді краще мати швидкі звички в одній, ніж повільні звички в декількох з них.


2
Є спосіб покращити досвід IntelliJ: зберегти та компілювати під час переходу на браузер
ruX

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

1
@Max, IntelliJ виконує ті дії під час фіксації (що на мій особистий смак - найкращий момент). У деяких випадках він також висвітлює проблеми стилю кодування безпосередньо в редакторі (наприклад, відповідність PEP8 для python).
andruso

2
Звикнення до того, що одна IDE робить для мене, а інша не робить, що ускладнює моє життя, не є хорошим моментом продажу.
Джонатан

1
@Jonathan покращення юзабіліті дуже часто вимагає відмови від старих, часто непотрібних звичок для користувачів.
andruso

17

Я закінчив записувати макрос, щоб зберегти і компілювати в один крок, і клавіатурну карту Ctrl+sдо нього.


5
@SecretService Можливо, працює не для всіх, оскільки порядок дій не визначений, коли декілька дій відображається на одній ярлиці.
Село

13

Мені вдалося вирішити це за допомогою макросів.

Я почав записувати макрос:

  • Клацніть Редагувати - Макроси - Почніть запис макросу
  • Клацніть Файл - зберегти все
  • Клацніть Побудувати - Зробити проект
  • Клацніть Редагувати - Макроси - Зупиніть запис макросу

Назвіть це щось корисне на кшталт "SaveAndMake".

Тепер просто видаліть Зберегти всі палітурні клавіші та додайте те саме вкладання макросу до свого макросу!

Отже, щоразу, коли я економлю, він зберігає та робить брудну компіляцію, а jRebel тепер правильно визначає всі зміни.


Я б запропонував надати макросу інше прив'язування клавіш, а не замінити існуючий зберегти все - але це лише однаково суб'єктивно.
arcseldon

Дякую. Оскільки нормального "Збірка" (як це пропонують інші відповіді) для мене навіть недостатньо, я використовую це рішення, щоб заощаджувати + відновлювати кожен раз. Повертає мені відчуття затемнення, навіть якщо воно споживає багато ресурсів ...
Борис

5

Будь ласка уважно виконайте ці кроки, щоб увімкнути це.

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

2) викликати довідку-> Знайти дію ... та ввести "Реєстр", у діалоговому вікні знайти "автоматичне" та включити запис " compiler.automake.allow.when.app.running ", закрити діалогове вікно

3) включити компіляцію фону в Налаштуваннях-> Збірка, Виконання, Розгортання-> Компілятор "Зробити проект автоматично"

4) відкрийте конфігурацію запуску Spring Boot, вам слід отримати попередження, якщо все налаштовано правильно

5) Запустіть додаток, змініть заняття на ходу

Будь ласка, повідомте про свій досвід та проблеми як коментарі до цього питання.

натисніть тут для отримання додаткової інформації


Це позначено як "У процесі роботи" і не працює для мене.
JGarrido

2

Єдине, що працювало на мене в моєму проекті Maven, який вплинув на це, - це додати мету "тестування-складання" до конфігурації запуску моїх одиничних тестів. Неймовірно незграбне рішення, але воно працює.

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


принаймні, це працює: D, але так, краще знайти джерело цієї проблеми
anindis

2

Intellij тихо виходить з ладу, коли стикається з проблемою компіляції в іншому модулі, і тоді автоматична збірка не виконується. Тож перевірте своє Problemsвікно


1

У мене було те саме питання. Я використовував "Режим економії енергії", який запобігає поступовому компілюванню і показує помилки компіляції.


Idont знаю, чому ця відповідь зникла, вона також відповідає на питання, для мене було те саме - "Режим енергозбереження", хоча його написано в налаштуваннях, але з цим увімкненим автоматичним компілюванням не працює.
Нерій Йок

1

Скористайтесь плагіном Reformat and Compile (надихнувши плагін Save Actions Олександра 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


це приємно, але питання полягало у автоматичному складенні файлів збереження, без того, щоб знову складати
чіткість

1

Це не працювало для мене через те, що в моїй структурі проекту був непотрібний модуль. Тести були виконані за допомогою іншого модуля, я думаю.

Я не знаю, як все закінчилося так, але усунення вирішило проблему.

Переконайтеся, що в налаштуваннях Run / Debug використовується модуль, який ви будуєте за допомогою автоматичного збереження.

Наприклад: див. Модуль в

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

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

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


1

У мене було те саме питання. Я думаю, було б доречно перевірити, чи можна складати ваш клас чи ні. Клацніть перекомпілювати (за замовчуванням Ctrl + Shift + F9). Якщо вона не працює, то вам доведеться дослідити, чому вона не компілюється.

У моєму випадку код не було автоматичним компілюванням, оскільки були приховані помилки під час компіляції (вони ніде не відображалися в журналах, і Maven clean-install працював). Основною причиною була неправильна структура проекту -> конфігурація модулів, тому Intellij Idea не змогла побудувати її відповідно до цієї конфігурації.


1

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


0

Я отримував помилку: деякі банки не перебувають у classpath. Отже, я просто видаляю пошкоджену банку та перформну форму нижче кроків

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

Не вистачає балів, щоб прокоментувати існуючу відповідь, але подібно до деяких людей вище, я завершив додавання макросу та клавішної карти для організації імпорту / форматування / збереження / швидкого завантаження (F9) / синхронізації .

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.