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.