Klasy Java Intellij IDEA Java nie są automatycznie kompilowane podczas zapisywania


182

Wczoraj przestawiłem się na IntelliJ IDEA z Eclipse.

Używam JRebel również z WebSphere Server 7.

Teraz wszystko wydaje się działać całkiem dobrze, z wyjątkiem tego, że kiedy modyfikuję plik Java i wciskam save , IntelliJ nie dokonuje ponownej kompilacji pliku, aby JRebel mógł go pobrać.

Funkcja „ Kompiluj automatycznie ” Eclipse rozwiązała ten problem.

W IntelliJ IDEA muszę nacisnąć CTRL+ SHIFT+, 9aby ponownie skompilować odpowiednią klasę, aby JRebel ją podniósł. Jeśli zmiany zostaną wprowadzone w dwóch plikach , muszę to zrobić na każdym z nich nich, a ponieważ IntelliJ używa mechanizmu zapisz wszystko, bardzo trudno jest wiedzieć, co ręcznie skompilować, czego tak naprawdę nie jestem zainteresowany.

Czy nie ma sposobu, aby zmusić IntelliJ do zrobienia tego samodzielnie ?


11
Dlaczego po prostu nie naciśniesz Ctrl+ F9? To zbuduje cały projekt, a jeśli zmieni się tylko dwa pliki, zostaną one odbudowane.
maba

2
Bałem się, że wszystko odbuduje. Wierzę, że domyślnie jest wyraźny wynik po przebudowie ... więc normalnie to nie działa dobrze ...
mmm

5
Robi nie czyścić przed kompilacji. To przyrostowa kompilacja. W razie potrzeby masz inny wybór do odbudowania.
maba

Odpowiedzi:


250

AKTUALIZACJA

W przypadku wersji IntelliJ IDEA 12+ możemy automatycznie budować edytowane źródła, jeśli korzystamy z opcji zewnętrznego kompilatora. Wystarczy tylko zaznaczyć opcję „ Automatycznie buduj projekt ”, znajdującą się w ustawieniach „ Kompilatora ”:

Ustawienia kompilatora

Ponadto, jeśli chcesz wdrożyć na gorąco, gdy aplikacja jest uruchomiona lub jeśli korzystasz z devtools wiosennego rozruchu, powinieneś również włączyć compiler.automake.allow.when.app.runningrejestr. To automatycznie skompiluje twoje zmiany.

Używanie Ctrl+ Shift+ A(lub + Shift+ Ana Macu) Registrypo otwarciu okna rejestru, zlokalizuj i włącz compiler.automake.allow.when.app.running, patrz tutaj:

wprowadź opis zdjęcia tutaj


W przypadku wersji starszych niż 12 możesz użyć wtyczki EclipseMode, aby IDEA automatycznie kompilowała zapisane pliki.

Więcej wskazówek można znaleźć w przewodniku „Migracja z Eclipse do IntelliJ IDEA” .


10
Denerwuje mnie, że muszę do tego zainstalować wtyczkę. Wczoraj i dziś spędziłem na tym. Chciałbym, żeby mogli po prostu wbudować taką opcję. Nie sądzę, żeby Eclipse miało patent na tę funkcję, prawda? Mógłbym również zmienić mapowanie na CTRL + S, aby zrobić, ponieważ zapisuje się automatycznie. Spróbuję kilku opcji. dzięki
mmm

14
To jest powolne. To jest zbyt wolne. Jest wiele miejsca na ulepszenia! Nie jestem tym, co robi w tle, ale kompilacja jednej małej zmiany w jednej klasie zajmuje Intellijowi około 3-4 sekund. Nawet „Kompiluj StartController.java”, co oznacza, że ​​jedna klasa zajmuje tylko 3-4 sekundy. Eclipse robi to w mniej niż 100 milisekund. Ponownie przetestuję wtyczkę trybu zaćmienia i zdecyduję, z czym pójść ..
mmm

34
„automatycznie
twórz

8
Nie działa dla mnie z Intellij 2017.1.3 i devtools wiosennego rozruchu.
Nico de Wet

1
Nie współpracuj z IntelliJ IDEA 2017.3.3, Java 9.0.4, Spring Boot 2.0.0.RC1, Spring devtools :(
Do Nhu Vy

75

Wykonaj oba kroki:

1 - Włącz Automake z kompilatora

  • Naciśnij: ctrl+ shift+ A(dla Mac + shift+ A)
  • Rodzaj: make project automatically
  • Trafienie: Enter
  • Włącz Make Project automaticallyfunkcję

2 - Włącz Automake, gdy aplikacja jest uruchomiona

  • Naciśnij: ctrl+ shift+ A(dla Mac + shift+ A)
  • Rodzaj: Registry
  • Znajdź klucz compiler.automake.allow.when.app.runningi włącz go lub kliknij pole wyboru obok niego

Uwaga: uruchom ponownie aplikację teraz :)

Uwaga: Powinno to również umożliwić przeładowanie na żywo z devtools wiosennego rozruchu.


2
Idealnie, właśnie tego szukałem =)
eitch

3
Działa to również dla mnie z wiosennymi boot-devtools i IntelliJ IDEA 2016.2.5
Xaero Degreaz

2
Racja, więc wydaje się, że działa to na IntelliJ 2017.1.3, użyłem opcji 2, ponieważ tego właśnie potrzeba w przypadku devtools na wiosnę.
Nico de Wet

1
Działał dobrze, ale przeładowanie w JRebel zajmuje 4-5 sekund. Jakiś sposób na to?
user3184974

1
Nie sądzę, aby powyższe pozycje 1 i 2 były „opcjami”, ale są krokami. Musisz zrobić jedno i drugie.
Thomas Carlisle

67

OSTRZEŻENIE

Wtyczka trybu Eclipse jest przestarzała i nie jest kompatybilna z najnowszymi kompilacjami IDEA 12+. Jeśli go zainstalujesz, IDE zawiesi się przy każdej zmianie pliku i zareaguje bardzo wolno.


IntelliJ IDEA nie korzysta z automatycznej kompilacji, wykrywa błędy w locie, a nie za pośrednictwem kompilatora. Podobnie do trybu Eclipse będzie dostępny w IDEA 12 :

Wykonaj projekt automatycznie

Użyj Build|Make, wywołuje proces tworzenia przyrostowego, który kompiluje tylko zmienione i zależne pliki (jest to bardzo szybki).

Istnieje również wpis FAQ, który może pomóc.

Aktualizacja funkcji automatycznego tworzenia : gdy uruchomiona jest konfiguracja uruchamiania / debugowania, Make project automaticallynie ma żadnego efektu. Klasy na dysku zmienią się tylko w Build| Make. Jest to podstawowa decyzja projektowa, ponieważ naszym zdaniem zmiany klasy na dysku powinny być zawsze pod kontrolą użytkownika. Automatyczne tworzenie nie jest naśladowaniem funkcji Eclipse, działa inaczej, a jej głównym celem jest zaoszczędzenie czasu na przygotowanie klas, gdy są naprawdę potrzebne (przed uruchomieniem aplikacji lub testów). Automatyczne tworzenie nie zastępuje jawnej kompilacji, którą nadal trzeba uruchomić, jak w przypadku opisanym w tym pytaniu. Jeśli szukasz innego zachowania, lepszym wyborem byłaby wtyczka EclipseMode połączona w powyższym FAQ.


Tak, widziałem to wcześniej, ale odrzuciłem to jako zbyt wolne, z wyskakującym oknem i wszystkim. Myślałem, że to coś innego. Mógłbym spróbować mimo wszystko, CTRL + 9 jest denerwujący, ale myślę, że mógłbym zmienić mapowanie na CTRL + S, aby zrobić, ponieważ zapisuje się automatycznie.
mmm

Dziękuję za aktualizację. Zainstalowałem wtyczkę Eclipse Mode. Nie mam tego okna dialogowego ... Ook .. Intellij 12 ... dobrze, że poprawiasz. Czy intellij 12 jest w ogóle wyrównany?
mmm

3
Próbowałem 12 razy przez kilka dni. Użyj zewnętrznej kompilacji -> make automatycznie nie uruchamia żadnej akcji. Nic się nie dzieje. Kiedy używam wtyczki trybu zaćmienia (włącz / wyłącz ją w ustawieniach), która działa dobrze, ale kiedy wyłączam wtyczkę trybu zaćmienia i włączam „użyj zewnętrznej kompilacji -> auto make”, nic się nie dzieje podczas edycji i zapisywania ... czemu?
mmm

2
@CrazyCoder Właśnie wróciłem do tego i jRebel. To jest zbyt wolne. Jest wiele miejsca na ulepszenia! Nie jestem tym, co robi w tle, ale kompilacja jednej małej zmiany w jednej klasie zajmuje Intellijowi około 3-4 sekund. Nawet „Kompiluj StartController.java”, co oznacza, że ​​jedna klasa zajmuje tylko 3-4 sekundy. Eclipse robi to w mniej niż 100 milisekund. Ponownie przetestuję wtyczkę i zdecyduję, z czym pójść ..
mmm

1
Sugestie dotyczące zachowania karty @SecretService są mile widziane na youtrack.jetbrains.com/issues/IDEA . Istnieje już kilka otwartych problemów dotyczących przypiętych kart i uniemożliwienia ich zamknięcia.
CrazyCoder,

38

Możesz utworzyć mapę klawiszy, ctrl+saby zapisać ORAZ skompilować w jednym kroku. Przejdź do ustawień mapy klawiszy i wyszukaj Compile.


3
Dzięki, podoba mi się to najbardziej! Auto kompilacja w intellij, i ta także, ale przynajmniej widzę, kiedy teraz się kończy, jest zbyt wolna.
mmm

Nie działało dla mnie, przypisanie CTRL + S do kompilacji nie zrestartowało mojego serwera start z przyciskiem debugowania
Dimitri Kopriwa

Działa dla mnie, Intellij 2018.2. Powinien poszukać Build Project
Neo Pham

18

W rzeczywistości nie ma różnicy, ponieważ oba wymagają 1 kliknięcia:

  • Eclipse : ręczne zapisywanie, automatyczne kompilowanie.
  • IntelliJ : automatyczne zapisywanie, kompilacja ręczna.

Najprostszym rozwiązaniem jest przyzwyczajenie się do tego. Ponieważ kiedy spędzasz większość dnia w swoim IDE, lepiej mieć szybkie nawyki w jednym niż powolne nawyki w kilku z nich.


2
Istnieje sposób na poprawę jakości IntelliJ: zapisz i skompiluj podczas przechodzenia do przeglądarki
ruX

Eclipse ma możliwość dodawania akcji zapisywania, więc możesz także wykonywać takie czynności, jak organizowanie importu i formatowanie kodu podczas zapisywania. Wykonanie wszystkich tych czynności ręcznie powoduje znaczną liczbę naciśnięć klawiszy i sprawia, że ​​proces jest bardziej podatny na błędy. Na przykład nigdy nie możesz mieć niesformatowanego kodu, jeśli sformatujesz przy zapisie w Eclipse. Bardzo łatwo zapomnieć o formatowaniu w IntelliJ.
Maks.

1
@ Max, IntelliJ uruchamia te akcje podczas zatwierdzania (co według mojego osobistego gustu jest najlepszym momentem). W niektórych przypadkach podkreśla również problemy ze stylem kodowania bezpośrednio w edytorze (np. Zgodność z PEP8 dla Pythona).
andruso

2
Przyzwyczajenie się do czegoś, co jedno IDE robi dla mnie, a inne nie, co utrudnia moje życie, nie jest dobrą zaletą.
Jonathan

1
@Jonathan poprawiający użyteczność bardzo często wymaga porzucenia starych, często niepotrzebnych nawyków użytkowników.
andruso

17

Skończyło się na tym, że nagrałem Makro, aby zapisać i skompilować w jednym kroku, oraz mapę klawiszy Ctrl+s.


5
@SecretService Może nie działać dla wszystkich, ponieważ kolejność akcji nie jest zdefiniowana, gdy wiele akcji jest odwzorowanych na ten sam skrót.
Celos

13

Udało mi się to rozwiązać za pomocą makr.

Zacząłem nagrywać makro:

  • Kliknij Edytuj - Makra - Rozpocznij rejestrowanie makra
  • Kliknij Plik - Zapisz wszystko
  • Kliknij Kompiluj - Utwórz projekt
  • Kliknij Edytuj - Makra - Zatrzymaj rejestrowanie makra

Nazwij to coś użytecznego, na przykład „SaveAndMake”.

Teraz wystarczy usunąć opcję Zapisz wszystkie skróty klawiszowe i dodać to samo przypisanie klawiszy do makra!

Tak więc teraz, za każdym razem, gdy zapisuję, zapisuje i tworzy brudną kompilację, a jRebel teraz poprawnie wykrywa wszystkie zmiany.


Sugerowałbym nadanie makrze innego przypisania zamiast zastępowania istniejącego oprócz wszystkich - ale byłoby to równie subiektywne.
arcseldon

Dzięki. Ponieważ normalna „kompilacja” (jak sugerują inne odpowiedzi) nie jest dla mnie nawet wystarczająca, za każdym razem używam tego rozwiązania do zapisywania + odbudowy. Przywraca mi uczucie zaćmienia, nawet jeśli pochłania dużo zasobów ...
Boris

5

Proszę dokładnie wykonać te kroki, aby ją włączyć.

1) utwórz projekt Spring Boot z SB V1.3 i dodaj „Devtools” (1 *) do zależności

2) wywołaj Pomoc-> Znajdź akcję ... i wpisz „Rejestr”, w oknie dialogowym wyszukaj „automake” i włącz wpis „ compiler.automake.allow.when.app.running ”, zamknij okno dialogowe

3) włącz kompilację w tle w Ustawieniach-> Kompilacja, wykonanie, wdrożenie-> Kompilator „Utwórz projekt automatycznie”

4) otwórz konfigurację uruchamiania Spring Boot, powinieneś otrzymać komunikat ostrzegawczy, jeśli wszystko jest poprawnie skonfigurowane

5) Uruchom aplikację, zmieniaj klasy w locie

Zgłoś swoje doświadczenia i problemy jako komentarze do tego problemu.

kliknij tutaj, aby uzyskać więcej informacji


Jest oznaczony jako „W toku” i nie działa dla mnie.
JGarrido

2

Jedyną rzeczą, która działała dla mnie w moim projekcie maven, na który to miało wpływ, jest dodanie celu „kompilacja testu” do konfiguracji uruchamiania moich testów jednostkowych. Niesamowicie nieporadne rozwiązanie, ale działa.

wprowadź opis zdjęcia tutaj


przynajmniej działa: D, ale tak, lepiej jest znaleźć źródło tego problemu
anindis

2

Intellij po cichu zawodzi, gdy napotyka problem kompilacji w innym module, a następnie nie jest wykonywana automatyczna kompilacja. Więc sprawdź swoje Problemsokno


1

Miałem ten sam problem. Korzystałem z „trybu oszczędzania energii”, który zapobiega kompilacji przyrostowej i pokazywaniu błędów kompilacji.


Nie wiem, dlaczego ta odpowiedź została zanegowana, to także odpowiada na pytanie, dla mnie było to samo - „Tryb oszczędzania energii”, chociaż napisano w ustawieniach, ale z tą włączoną automatyczną kompilacją nie działa.
Nerius Jok

1

Użyj wtyczki Reformat i Compile (zainspirowanej wtyczką Save Actions Alexandre DuBreuil):

https://plugins.jetbrains.com/plugin/8231?pr=idea_ce

W tej chwili oferuję tylko plik jar, ale jest to najważniejsza część kodu:

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
Dlaczego ktoś miałby pobierać losowy kod i uruchamiać go?
Drew

@Drew: Właśnie przesłałem go do Jetbrains w celu sprawdzenia. Ale jeśli jesteś paranoikiem, myślę, że mógłbyś poczekać kilka dni, zanim będzie dostępny stamtąd ...
sbmpost

sbmpost, ja tylko wskazuję, dlaczego niektórzy (nie żebym tak zrobili) głosowali, oflagowali jako Not An Answer i usunęli to.
Drew

Jeśli jest to kod, możesz pisać w tekście, to świetnie. Czy możesz? To jest strona kodowa.
Drew

1
@drew: dodano notatkę o słoiku i dodano nieco więcej kontekstu do kodu. Może się to wydawać wysokim poziomem, ale jeśli rozszerzysz z FileDocumentManagerAdapter i dodasz kod, będziesz mieć (prawie) kompilującą klasę ReformatAndCompile.
sbmpost

1

Edytuj konfigurację uruchamiania / debugowania, aby przed uruchomieniem była wybrana opcja Kompilacja

wprowadź opis zdjęcia tutaj

Po wybraniu opcji kompilacji

wprowadź opis zdjęcia tutaj

Powyższe rozwiązanie działało dla mnie podczas pracy z moim pakietem testowym JBehave


to jest miłe, ale pytanie dotyczyło automatycznej kompilacji przy zapisywaniu, bez konieczności ponownego kompilowania wyjaśniania za pomocą niestandardowego polecenia, przed wykonaniem jakiegokolwiek testu, itp.,
kisna

1

Nie działało to dla mnie z powodu niepotrzebnego modułu w strukturze mojego projektu. Testy zostały wykonane przy użyciu innego modułu, jak sądzę.

Nie wiem, jak to się skończyło, ale usunięcie go rozwiązało problem.

Upewnij się, że twoje ustawienia Uruchom / Debuguj korzystają z modułu, który budujesz z autozapisywaniem.

Np .: patrz moduł w

wprowadź opis zdjęcia tutaj

Możesz zmienić moduły w strukturze projektu - moduły

wprowadź opis zdjęcia tutaj


1

Miałem ten sam problem. Myślę, że właściwe byłoby sprawdzenie, czy twoją klasę można skompilować, czy nie. Kliknij ponownie skompiluj (domyślnie Ctrl + Shift + F9). Jeśli nie działa, musisz zbadać, dlaczego się nie kompiluje.

W moim przypadku kod nie był automatycznie kompilowany, ponieważ były ukryte błędy w kompilacji (nie były nigdzie pokazywane w logach i działało maven clean-install). Przyczyna źródłowa była niepoprawna Struktura projektu -> Konfiguracja modułów, więc Intellij Idea nie był w stanie zbudować jej zgodnie z tą konfiguracją.


1

miałem ten sam problem, a także ikonę pliku problemem w IntelliJ, więc usunąłem.idea projekt import folderu i ponownie rozwiązać mój problem.


0

Wystąpił błąd: niektóre słoiki nie są w ścieżce klas, więc po prostu usuwam uszkodzony słoik i wykonuję poniższe czynności

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

Za mało punktów, by skomentować istniejącą odpowiedź, ale podobnie do niektórych osób powyżej, właśnie skończyłem dodając makro i mapę klawiszy do Organizuj import / Format / Zapisz wszystko / FastReload (F9) / Synchronizuj .

Synchronizacja została dodana, ponieważ wydaje się, że jest to jedyny sposób, w jaki mogę zobaczyć aktualizacje zasobów zmodyfikowane przez zewnętrzne narzędzia / obserwatory kompilacji (np. Webpack).

Proces ten przebiega wolniej niż zaćmienie - i dla zewnętrznego odświeżania pliku często trzeba uruchamiać polecenie wiele razy - ale załóżmy, że mogę z tym żyć.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.