Les classes Java Intellij IDEA ne se compilent pas automatiquement lors de l'enregistrement


182

Hier, je suis passé à IntelliJ IDEA d'Eclipse.

J'utilise également JRebel avec WebSphere Server 7.

Tout semble maintenant fonctionner assez bien, sauf que lorsque je modifie un fichier Java et que je clique sur Enregistrer , IntelliJ ne recompile pas le fichier, afin que JRebel le récupère.

La fonctionnalité Eclipse " Build Automatically " a résolu ce problème.

Dans IntelliJ IDEA, je dois appuyer sur CTRL+ SHIFT+ 9pour recompiler la classe appropriée pour que JRebel la récupère. Si des modifications sont apportées à deux fichiers , je dois le faire sur chacun d' entre eux et comme IntelliJ utilise le mécanisme de sauvegarde de tout, il est assez difficile de savoir quoi recompiler manuellement, ce qui ne m'intéresse pas vraiment non plus.

N'y a-t-il pas un moyen de faire en sorte qu'IntelliJ le fasse seul ?


11
Pourquoi n'appuyez-vous pas simplement sur Ctrl+ F9? Cela construira l'ensemble du projet et si seulement deux fichiers ont été modifiés, ceux-ci seront reconstruits.
maba

2
J'avais peur que tout reconstruise. Je crois que la valeur par défaut est une sortie claire lors de la reconstruction ... donc normalement cela ne fonctionne pas très bien ...
mmm

5
Il ne nettoie pas avant la construction. C'est une construction incrémentielle. Vous avez un autre choix pour reconstruire si vous le souhaitez.
maba

Réponses:


250

ACTUALISÉ

Pour les versions d'IntelliJ IDEA 12+, nous pouvons créer automatiquement les sources modifiées si nous utilisons l'option du compilateur externe. La seule chose à faire est de cocher l'option " Construire le projet automatiquement ", située dans les paramètres " Compilateur ":

Paramètres du compilateur

De plus, si vous souhaitez effectuer un déploiement à chaud, pendant que l'application est en cours d'exécution ou si vous utilisez les outils de développement Spring Boot, vous devez également activer le compiler.automake.allow.when.app.runningregistre. Cela compilera automatiquement vos modifications.

En utilisant Ctrl+ Shift+ A(ou + Shift+ Asur Mac) tapez Registryune fois que la fenêtre de registre est ouverte, recherchez et activez compiler.automake.allow.when.app.running, voir ici:

entrez la description de l'image ici


Pour les versions antérieures à 12, vous pouvez utiliser le plugin EclipseMode pour que IDEA compile automatiquement les fichiers enregistrés.

Pour plus de conseils, consultez le guide «Migration d'Eclipse vers IntelliJ IDEA» .


10
C'est ennuyeux que je doive installer un plugin pour cela. J'ai déjà passé hier et aujourd'hui là-dessus. Je souhaite qu'ils puissent simplement intégrer une option pour cela, je ne pense pas qu'Eclipse ait un brevet sur cette fonctionnalité, n'est-ce pas? Je pourrais également remapper sur CTRL + S pour faire une sauvegarde automatique. Je vais essayer quelques options. merci
mmm

14
C'est lent. C'est trop lent. Il y a beaucoup à faire! Je ne suis pas ce qu'il fait en arrière-plan, mais il faut à Intellij environ 3-4 secondes pour compiler un petit changement dans une seule classe. Même le "Compile 'StartController.java'" signifiant qu'une classe ne prend que 3-4 secondes. Eclipse le fait en moins de 100 millisecondes. Je vais tester à nouveau le plugin du mode eclipse et décider avec quoi aller.
mmm

34
"créer un projet automatiquement" ne fonctionne que lorsqu'il n'est pas en cours d'exécution / débogage
xenoterracide

8
Ne fonctionne pas pour moi avec Intellij 2017.1.3 et les devtools de spring boot.
Nico de Wet

1
Ne fonctionne pas avec IntelliJ IDEA 2017.3.3, Java 9.0.4, Spring Boot 2.0.0.RC1, Spring devtools :(
Do Nhu Vy

75

Veuillez suivre les deux étapes:

1 - Activez Automake depuis le compilateur

  • Appuyez sur: ctrl+ shift+ A(pour Mac + shift+ A)
  • Type: make project automatically
  • Frappé: Enter
  • Activer la Make Project automaticallyfonctionnalité

2 - Activez Automake lorsque l'application est en cours d'exécution

  • Appuyez sur: ctrl+ shift+ A(pour Mac + shift+ A)
  • Type: Registry
  • Recherchez la clé compiler.automake.allow.when.app.runninget activez-la ou cochez la case à côté

Remarque: redémarrez votre application maintenant :)

Remarque: Cela devrait également permettre le rechargement en direct avec les outils de développement Spring Boot.


2
Parfait, c'était exactement ce que je cherchais =)
eitch

3
Cela a également fonctionné pour moi avec spring-boot-devtools et IntelliJ IDEA 2016.2.5
Xaero Degreaz

2
Bien, donc cela semble fonctionner sur IntelliJ 2017.1.3, j'ai utilisé l'option 2 car c'est ce dont on a besoin avec les outils de développement Spring Boot.
Nico de Wet

1
Cela a bien fonctionné mais il faut 4 à 5 secondes pour recharger dans JRebel. Un moyen de contourner cela?
user3184974

1
Je ne pense pas que les éléments 1 et 2 ci-dessus soient des "options", mais ce sont des étapes. Vous devez faire les deux.
Thomas Carlisle

67

AVERTISSEMENT

Le plug-in du mode Eclipse est obsolète et n'est pas compatible avec les versions récentes d'IDEA 12+. Si vous l'installez, l'EDI se bloquera à chaque changement de fichier et répondra extrêmement lentement.


IntelliJ IDEA n'utilise pas de compilation automatique, il détecte les erreurs à la volée, pas via le compilateur. Similaire au mode Eclipse sera disponible dans IDEA 12 :

Créer un projet automatiquement

Utiliser Build| Make, il invoque le processus de création incrémentiel qui ne compilera que les fichiers modifiés et dépendants (c'est très rapide).

Il existe également une entrée de FAQ qui peut vous aider.

Mise à jour sur la fonction de création automatique : lorsque la configuration d'exécution / débogage est en cours d'exécution, Make project automaticallyn'a aucun effet. Les classes sur le disque ne changeront que le Build| Make. C'est la décision de conception fondamentale car, à notre avis, les changements de classe sur le disque devraient toujours être sous le contrôle de l'utilisateur. La création automatique n'est pas le copieur de la fonction Eclipse, elle fonctionne différemment et son objectif principal est de gagner du temps en attendant que les classes soient prêtes quand elles sont vraiment nécessaires (avant d'exécuter l'application ou les tests). La création automatique ne remplace pas la compilation explicite que vous devez encore déclencher comme dans le cas décrit dans cette question. Si vous recherchez un comportement différent, le plug-in EclipseMode lié dans la FAQ ci-dessus serait un meilleur choix.


Oui, je l'avais déjà vu, mais je l'ai rejeté comme étant trop lent, avec le popup et tout. Je pensais que c'était pour autre chose. Je pourrais peut-être essayer, même si CTRL + 9 est ennuyeux, mais je suppose que je pourrais remapper sur CTRL + S pour effectuer une sauvegarde automatique.
mmm

Merci pour la mise à jour. J'ai installé le plugin Eclipse Mode. N'avez pas ce dialogue ... Ook .. Intellij 12 ... eh bien, bien que vous vous améliorez. Intellij 12 est-il égal?
mmm

3
J'essaie 12 depuis quelques jours. L'utilisation de build externe -> make ne déclenche automatiquement aucune action. Rien ne s'est passé. Lorsque j'utilise le plugin du mode eclipse (activez / désactivez-le à partir des paramètres) cela fonctionne bien, mais lorsque je désactive le plugin du mode eclipse et que j'active "utiliser la construction externe -> création automatique", rien ne se passe lors de l'édition et de l'enregistrement ... toute idée à Pourquoi?
mmm

2
@CrazyCoder Je viens de revenir là-dessus et jRebel. C'est trop lent. Il y a beaucoup à faire! Je ne suis pas ce qu'il fait en arrière-plan, mais il faut à Intellij environ 3-4 secondes pour compiler un petit changement dans une seule classe. Même le "Compile 'StartController.java'" signifiant qu'une classe ne prend que 3-4 secondes. Eclipse le fait en moins de 100 millisecondes. Je vais tester à nouveau le plugin et décider avec quoi aller ..
mmm

1
Les suggestions de comportement de l'onglet @SecretService sont les bienvenues sur youtrack.jetbrains.com/issues/IDEA . Il existe déjà plusieurs problèmes en suspens concernant les onglets épinglés et les empêchant de se fermer.
CrazyCoder

38

Vous pouvez créer un keymap ctrl+spour enregistrer ET compiler en une seule étape. Accédez aux paramètres du clavier et recherchez Compile.


3
Merci, j'aime mieux ça! La compilation automatique dans intellij, et celle-ci aussi, mais au moins je vois quand elle se termine maintenant, est trop lente.
mmm

Cela n'a pas fonctionné pour moi, attribuer CTRL + S à la compilation n'a pas redémarré mon serveur avec le bouton de débogage
Dimitri Kopriwa

Cela fonctionne pour moi, Intellij 2018.2. Il devrait rechercher Build Project
Neo Pham

18

Il n'y a en fait aucune différence car les deux nécessitent 1 clic:

  • Eclipse : sauvegarde manuelle, compilation automatique.
  • IntelliJ : sauvegarde automatique, compilation manuelle.

La solution la plus simple consiste simplement à s'y habituer. Parce que lorsque vous passez la majeure partie de votre journée dans votre IDE, il vaut mieux avoir des habitudes rapides dans l'une que des habitudes lentes dans plusieurs d'entre elles.


2
Il existe un moyen d'améliorer l'expérience IntelliJ: enregistrez et compilez pendant que vous passez au navigateur
ruX

Eclipse a la capacité d'ajouter des actions d'enregistrement, vous pouvez donc également faire des choses comme organiser les importations et formater le code lors de l'enregistrement. Faire toutes ces choses manuellement ajoute un nombre important de frappes et rend le processus plus sujet aux erreurs. Par exemple, vous ne pouvez jamais avoir de code non formaté si vous formatez lors de l'enregistrement dans Eclipse. Il est très facile d'oublier le formatage dans IntelliJ.
Max

1
@Max, IntelliJ exécute ces actions pendant la validation (ce qui à mon goût personnel est le meilleur moment). Dans certains cas, il met également en évidence les problèmes de style de codage directement dans l'éditeur (par exemple la conformité PEP8 pour python).
andruso

2
S'habituer à quelque chose qu'un IDE fait pour moi et qu'un autre ne fait pas, ce qui rend ma vie plus difficile, n'est pas un bon argument de vente.
Jonathan

1
@Jonathan améliorer la convivialité nécessite très souvent d'abandonner de vieilles habitudes, souvent inutiles, des utilisateurs.
andruso

17

J'ai fini par enregistrer une macro pour la sauvegarder et la compiler en une seule étape, et y ajouter un keymap Ctrl+s.


5
@SecretService Peut ne pas fonctionner pour tout le monde, car l'ordre des actions n'est pas défini lorsque plusieurs actions sont mappées sur le même raccourci.
Celos

13

J'ai réussi à résoudre ce problème en utilisant des macros.

J'ai commencé à enregistrer une macro:

  • Cliquez sur Modifier - Macros - Démarrer l'enregistrement de la macro
  • Cliquez sur Fichier - Tout enregistrer
  • Cliquez sur Construire - Créer un projet
  • Cliquez sur Modifier - Macros - Arrêter l'enregistrement des macros

Nommez-le quelque chose d'utile comme "SaveAndMake".

Maintenant, supprimez simplement la combinaison de touches Enregistrer toutes et ajoutez la même combinaison de touches à votre macro!

Alors maintenant, chaque fois que j'enregistre, il enregistre et fait une compilation sale, et jRebel détecte maintenant toutes les modifications correctement.


Suggérerait de donner à la macro une combinaison de touches différente plutôt que de remplacer la sauvegarde existante - mais cela étant tout aussi subjectif.
arcseldon

Merci. Puisqu'un "Build" normal (comme suggéré par les autres réponses) n'est même pas suffisant pour moi, j'utilise cette solution pour enregistrer + reconstruire à chaque fois. Me redonne le sentiment Eclipse, même si cela consomme beaucoup de ressources ...
Boris

5

Veuillez suivre attentivement ces étapes pour l'activer.

1) créer un projet Spring Boot avec SB V1.3 et ajouter "Devtools" (1 *) aux dépendances

2) invoquez Help-> Find Action ... et tapez "Registry", dans la boîte de dialogue recherchez "automake" et activez l'entrée " compiler.automake.allow.when.app.running ", fermez le dialogue

3) activer la compilation en arrière-plan dans Paramètres-> Construire, Exécution, Déploiement-> Compilateur "Créer un projet automatiquement"

4) ouvrez la configuration d'exécution de Spring Boot, vous devriez recevoir un message d'avertissement si tout est configuré correctement

5) Exécutez votre application, changez vos cours à la volée

Veuillez signaler vos expériences et problèmes en tant que commentaires sur ce problème.

cliquez ici pour plus d'informations


Il est marqué comme toujours "En cours" et ne fonctionne pas pour moi.
JGarrido

2

La seule chose qui a fonctionné pour moi dans mon projet maven qui a été affecté par cela est d'ajouter un objectif "test-compilation" à la configuration d'exécution de mes tests unitaires. Solution incroyablement maladroite, mais cela fonctionne.

entrez la description de l'image ici


au moins ça marche: D mais ouais, il vaut mieux trouver une source de ce problème
anindis

2

Intellij échoue silencieusement lorsqu'il rencontre un problème de compilation dans un autre module, puis la construction automatique n'est pas effectuée. Alors vérifiez votre Problemsfenêtre


1

J'ai eu le même problème. J'utilisais le "mode d'économie d'énergie", qui empêche de compiler de manière incrémentielle et d'afficher des erreurs de compilation.


Je ne sais pas pourquoi cette réponse a été rejetée, elle répond également à la question, pour moi, c'était la même chose - "Mode d'économie d'énergie", bien que ce soit écrit dans les paramètres, mais avec cette compilation automatique activée ne fonctionne pas.
Nerius Jok

1

Utilisez le plugin Reformat and Compile (inspiré du plugin Save Actions d'Alexandre DuBreuil):

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

Pour le moment, je ne propose qu'un fichier jar, mais c'est la partie la plus importante du code:

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
Pourquoi quelqu'un téléchargerait-il du code aléatoire et l'exécuterait-il?
Tiré

@Drew: Je viens de le télécharger sur Jetbrains pour examen. Mais si vous êtes paranoïaque, je suppose que vous pourriez attendre quelques jours avant qu'il ne soit disponible à partir de là ...
sbmpost

sbmpost, je souligne simplement pourquoi certains (pas que ce soit moi) refusent de voter, signalent comme Pas une réponse et font supprimer cela.
Tiré

Si c'est du code que vous pouvez publier, sous forme de texte, c'est super. Peut tu? Ceci est un site de code.
Tiré

1
@drew: ajout d'une note sur le jar et ajout d'un peu plus de contexte au code. Cela peut sembler de haut niveau, mais si vous étendez FileDocumentManagerAdapter et ajoutez le code, vous auriez (presque) une classe ReformatAndCompile de compilation.
sbmpost

1

Modifiez votre configuration d'exécution / débogage afin que l'option Build soit sélectionnée avant le lancement

entrez la description de l'image ici

Une fois l'option de construction sélectionnée

entrez la description de l'image ici

La solution ci-dessus a fonctionné pour moi tout en travaillant sur ma suite de tests JBehave


c'est bien, mais la question portait sur la compilation automatique lors de la sauvegarde, sans avoir à recompiler l'explicite à l'aide d'une commande personnalisée, avant de faire quoi que ce soit comme exécuter un test, etc.,
kisna

1

Cela ne fonctionnait pas pour moi en raison d'un module inutile dans la structure de mon projet. Les tests ont été exécutés en utilisant l'autre module, je suppose.

Je ne sais pas comment ça s'est passé comme ça, mais le supprimer a résolu le problème.

Assurez-vous que vos paramètres d'exécution / débogage utilisent le module que vous créez avec l'enregistrement automatique.

Ex: voir le module dans

entrez la description de l'image ici

Vous pouvez modifier les modules dans Structure du projet - Modules

entrez la description de l'image ici


1

J'ai eu le même problème. Je pense qu'il serait approprié de vérifier si votre classe peut être compilée ou non. Cliquez sur recompiler (Ctrl + Maj + F9 par défaut). Si cela ne fonctionne pas, vous devez rechercher pourquoi il ne compile pas.

Dans mon cas, le code ne s'autocompilait pas car il y avait des erreurs cachées lors de la compilation (elles n'étaient pas affichées dans les journaux et maven clean-install fonctionnait). La cause principale était une structure de projet incorrecte -> Configuration des modules, donc Intellij Idea n'a pas pu le construire selon cette configuration.


1

J'ai eu le même problème et aussi une icône de fichier de problème dans intellij, donc j'ai supprimé le .ideadossier et réimporter le projet a résolu mon problème.


0

J'obtenais une erreur: certains jars ne sont pas dans classpath.Je supprime donc simplement le jar corrompu et perrform ci-dessous

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

Pas assez de points pour commenter une réponse existante, mais comme certaines personnes ci-dessus, j'ai fini par ajouter une macro et un keymap pour Organiser les importations / Format / SaveAll / FastReload (F9) / Synchronize .

La synchronisation est ajoutée car elle semble être la seule façon de voir les mises à jour des ressources modifiées par des outils / observateurs de construction externes (c'est-à-dire, Webpack).

Le processus est plus lent qu'éclipse - et pour l'actualisation du fichier externe, il faut souvent exécuter la commande plusieurs fois - mais supposons que je puisse vivre avec.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.