Las clases Java Intellij IDEA no se compilan automáticamente al guardar

182

Ayer me cambié a IntelliJ IDEA desde Eclipse.

Estoy usando JRebel con WebSphere Server 7 también.

Ahora todo parece estar funcionando bien, excepto que cuando modifico un archivo Java y presiono guardar , IntelliJ no vuelve a compilar el archivo, para que JRebel lo recoja.

La característica " Compilar automáticamente " de Eclipse resolvió este problema.

En IntelliJ IDEA, tengo que presionar CTRL+ SHIFT+ 9para volver a compilar la clase relevante para que JRebel la recoja. Si se realizan cambios en dos archivos , tengo que hacer esto en cada uno de ellos y dado que IntelliJ usa el mecanismo de guardar todo, es bastante difícil saber qué recompilar manualmente, lo que tampoco me interesa hacer.

¿No hay una manera de hacer que IntelliJ haga esto solo ?

mmm
fuente
11
¿Por qué no presionas Ctrl+ F9? Eso generará todo el proyecto y si solo dos archivos han cambiado, se reconstruirán.
maba
2
Tenía miedo de que reconstruiría todo. Creo que por defecto es clara salida en la reconstrucción ... así que normalmente esto no funciona para una buena ...
mmm
55
No se limpia antes de la construcción. Es una construcción incremental. Tiene otra opción para reconstruir si lo desea.
maba

Respuestas:

250

ACTUALIZADO

Para las versiones de IntelliJ IDEA 12+, podemos construir automáticamente las fuentes editadas si estamos utilizando la opción de compilador externo. Lo único que se necesita es marcar la opción " Crear proyecto automáticamente ", ubicada en la configuración de " Compilador ":

Configuraciones del compilador

Además, si desea realizar una implementación en caliente, mientras la aplicación se está ejecutando o si está utilizando las herramientas de arranque de Spring, también debe habilitar el compiler.automake.allow.when.app.runningregistro from. Esto compilará automáticamente sus cambios.

Usando el tipo Ctrl+ Shift+ A(o + Shift+ Aen Mac) Registryuna vez que la ventana de registro esté abierta, ubique y habilite compiler.automake.allow.when.app.running, vea aquí:

ingrese la descripción de la imagen aquí


Para versiones anteriores a la 12, puede usar el complemento EclipseMode para hacer que IDEA compile automáticamente los archivos guardados.

Para obtener más consejos, consulte la guía "Migración de Eclipse a IntelliJ IDEA" .

dan
fuente
10
Se siente molesto porque tengo que instalar un complemento para esto. Ya pasé ayer y hoy en esto. Desearía que pudieran crear una opción para esto, no creo que Eclipse tenga una patente sobre esta característica, ¿verdad? También podría reasignar a CTRL + S para hacer ya que se guarda automáticamente. Probaré un par de opciones. gracias
mmm
14
Esto es lento Esto es muy lento ¡Hay mucho margen de mejora! No soy lo que hace en segundo plano, pero a Intellij le toma unos 3-4 segundos compilar un pequeño cambio en una sola clase. Incluso el "Compilar 'StartController.java'", que significa una clase, solo toma 3-4 segundos. Eclipse hace esto en menos de 100 milisegundos. Volveré a probar el plugin del modo eclipse y decidiré con qué ir ...
mmm
34
"hacer proyecto automáticamente" solo funciona cuando no se está ejecutando / depurando
xenoterracide
8
No funciona para mí con Intellij 2017.1.3 y Spring Devtools.
Nico de Wet
1
No trabaje con IntelliJ IDEA 2017.3.3, Java 9.0.4, Spring Boot 2.0.0.RC1, Spring devtools :(
Do Nhu Vy
75

Por favor siga los dos pasos:

1 - Habilitar Automake desde el compilador

  • Presione: ctrl+ shift+ A(para Mac + shift+ A)
  • Tipo: make project automatically
  • Golpear: Enter
  • Habilitar Make Project automaticallycaracterística

2 - Habilite Automake cuando la aplicación se esté ejecutando

  • Presione: ctrl+ shift+ A(para Mac + shift+ A)
  • Tipo: Registry
  • Encuentre la clave compiler.automake.allow.when.app.runningy actívela o haga clic en la casilla de verificación junto a ella

Nota: reinicie su aplicación ahora :)

Nota: Esto también debería permitir la recarga en vivo con las herramientas de arranque de Spring.

snovelli
fuente
2
Perfecto, esto era justo lo que estaba buscando =)
eitch
3
Esto también funcionó para mí con spring-boot-devtools e IntelliJ IDEA 2016.2.5
Xaero Degreaz el
2
Bien, así que esto parece funcionar en IntelliJ 2017.1.3, utilicé la opción 2, ya que esto es lo que uno necesita con las herramientas de arranque de Spring.
Nico de Wet
1
Funcionó bien, pero tarda 4-5 segundos en recargarse en JRebel. ¿Alguna forma de evitar eso?
user3184974
1
No creo que los elementos 1 y 2 anteriores sean "opciones", sino pasos. Necesitas hacer ambos.
Thomas Carlisle
67

ADVERTENCIA

El complemento Eclipse Mode está obsoleto y no es compatible con las versiones recientes de IDEA 12+. Si lo instala, IDE se bloqueará en cada cambio de archivo y responderá extremadamente lento.


IntelliJ IDEA no usa compilación automática, detecta errores sobre la marcha, no a través del compilador. El modo similar a Eclipse estará disponible en IDEA 12 :

Hacer proyecto automáticamente

Uso Build|Make, invoca el proceso de creación incremental que compilará solo archivos modificados y dependientes (es muy rápido).

También hay una entrada de preguntas frecuentes que puede ayudar.

Actualización de la función de creación automática : cuando se ejecuta la configuración de ejecución / depuración, Make project automaticallyno tiene ningún efecto. Las clases en el disco cambiarán solo en Build| Make. Es la decisión central del diseño, ya que en nuestra opinión, los cambios de clase en el disco siempre deben estar bajo el control del usuario. La creación automática no es la imitación de la función Eclipse, funciona de manera diferente y su objetivo principal es ahorrar tiempo esperando que las clases estén listas cuando realmente se necesitan (antes de ejecutar la aplicación o las pruebas). La creación automática no reemplaza la compilación explícita que aún necesita activar como en el caso descrito en esta pregunta. Si está buscando un comportamiento diferente, el complemento EclipseMode vinculado en las preguntas frecuentes anteriores sería una mejor opción.

CrazyCoder
fuente
Sí, lo había visto antes, pero lo descarté como demasiado lento, con la ventana emergente y todo. Pensé que era por otra cosa. Podría intentarlo aunque CTRL + 9 sea molesto, pero creo que podría reasignarlo a CTRL + S para que se guarde automáticamente.
mmm
Gracias por la actualización. He instalado el complemento Eclipse Mode. No tengo ese diálogo ... Ook ... Intellij 12 ... bueno, qué bueno que estás mejorando. ¿Intellij 12 está igualado?
mmm
3
He estado probando 12 por un par de días. El uso de compilación externa -> make automáticamente no dispara ninguna acción. Nada feliz Cuando uso el complemento de modo eclipse (activar / desactivar desde la configuración) funciona bien, pero cuando desactivo el complemento de modo eclipse y habilito "usar compilación externa -> creación automática" no ocurre nada al editar y guardar ... alguna idea para ¿por qué?
mmm
2
@CrazyCoder Acabo de volver a esto y jRebel. Esto es muy lento ¡Hay mucho margen de mejora! No soy lo que hace en segundo plano, pero a Intellij le toma unos 3-4 segundos compilar un pequeño cambio en una sola clase. Incluso el "Compilar 'StartController.java'", que significa una clase, solo toma 3-4 segundos. Eclipse hace esto en menos de 100 milisegundos. Probaré el complemento nuevamente y decidiré con qué ir ..
mmm
1
Las sugerencias de comportamiento de la pestaña @SecretService son bienvenidas en youtrack.jetbrains.com/issues/IDEA . Ya hay varios problemas abiertos sobre las pestañas ancladas y evitar que se cierren.
CrazyCoder
38

Puede hacer un mapa ctrl+sde teclas para guardar Y compilar en un solo paso. Vaya a la configuración del mapa de teclas y busque Compile.

Daniel Kaplan
fuente
3
¡Gracias, me gusta más! La compilación automática en intellij, y esta también, pero al menos veo cuándo termina ahora, es demasiado lenta.
mmm
No funcionó para mí, asignar CTRL + S para compilar no reinició el inicio de mi servidor con el botón de depuración
Dimitri Kopriwa
A mí me funciona, Intellij 2018.2. Debería buscar Build Project
Neo Pham el
18

En realidad no hay diferencia ya que ambos requieren 1 clic:

  • Eclipse : guardado manual, compilación automática.
  • IntelliJ : guardado automático, compilación manual.

La solución más simple es acostumbrarse. Porque cuando pasa la mayor parte del día en su IDE, es mejor tener hábitos rápidos en uno que hábitos lentos en varios de ellos.

andruso
fuente
2
Hay una manera de mejorar la experiencia IntelliJ: guarde y compile mientras cambia al navegador
ruX
Eclipse tiene la capacidad de agregar acciones de guardado, por lo que también puede hacer cosas como organizar las importaciones y formatear el código al guardar. Hacer todas estas cosas manualmente agrega una cantidad significativa de pulsaciones de teclas y hace que el proceso sea más propenso a errores. Por ejemplo, nunca puede tener código sin formato si formatea al guardar en Eclipse. Es muy fácil olvidar el formateo en IntelliJ.
Max
1
@Max, IntelliJ ejecuta esas acciones durante la confirmación (que para mi gusto personal es el mejor momento). En algunos casos, también resalta los problemas de estilo de codificación directamente en el editor (por ejemplo, conformidad PEP8 para python).
andruso
2
Acostumbrarme a algo que un IDE hace por mí y otro no, lo que hace que mi vida sea más difícil, no es un buen argumento de venta.
Jonathan
1
@Jonathan, para mejorar la usabilidad, muchas veces es necesario abandonar viejos hábitos, a menudo innecesarios, para los usuarios.
andruso
17

Terminé grabando una Macro para guardar y compilar en un solo paso, y asignarle Ctrl+sun mapa .

TonioKnight
fuente
55
@SecretService podría no funcionar para todos, ya que el orden de las acciones no se define cuando se asignan varias acciones al mismo acceso directo.
Celos
13

Logré resolver esto usando macros.

Empecé a grabar una macro:

  • Haga clic en Editar - Macros - Iniciar grabación de macro
  • Haga clic en Archivo - Guardar todo
  • Haga clic en Build - Make Project
  • Haga clic en Editar - Macros - Detener la grabación de macros

Nómbrelo algo útil como "SaveAndMake".

¡Ahora simplemente elimine la combinación de teclas Guardar todo y agregue la misma combinación de teclas a su macro!

Entonces, cada vez que guardo, guarda y hace una compilación sucia, y jRebel ahora detecta todos los cambios correctamente.

Niklas Lönn
fuente
Sugeriría darle a la macro una combinación de teclas diferente en lugar de reemplazar el guardar todo, pero eso es igualmente subjetivo.
arcseldon
Gracias. Dado que una "compilación" normal (como lo sugieren las otras respuestas) ni siquiera es suficiente para mí, uso esta solución para guardar y reconstruir cada vez. Me devuelve la sensación de Eclipse, incluso si consume muchos recursos ...
Boris
5

Siga estos pasos cuidadosamente para habilitarlo.

1) cree el proyecto Spring Boot con SB V1.3 y agregue "Devtools" (1 *) a las dependencias

2) invoque Ayuda-> Buscar acción ... y escriba "Registro", en el cuadro de diálogo busque "automake" y habilite la entrada " compiler.automake.allow.when.app.running ", cierre el cuadro de diálogo

3) habilite la compilación en segundo plano en Configuración-> Compilación, Ejecución, Implementación-> Compilador "Crear proyecto automáticamente"

4) abra Spring Boot run config, debería recibir un mensaje de advertencia si todo está configurado correctamente

5) Ejecute su aplicación, cambie sus clases sobre la marcha

Informe sus experiencias y problemas como comentarios a este problema.

Haga clic aquí para más información

Ajay Kumar
fuente
Está marcado como "En progreso" y no funciona para mí.
JGarrido
2

Lo único que funcionó para mí en mi proyecto maven que se vio afectado por esto es agregar un objetivo de "compilación de prueba" a la configuración de ejecución de mis pruebas unitarias. Solución increíblemente torpe, pero funciona.

ingrese la descripción de la imagen aquí

keyboardsamurai
fuente
al menos funciona: D, pero sí, es mejor encontrar una fuente de este problema
anindis
2

Intellij falla silenciosamente cuando encuentra un problema de compilación en otro módulo, y luego no se realiza la compilación automática. Así que revisa tu Problemsventana

tworec
fuente
1

Tuve el mismo problema. Estaba usando el "Modo de ahorro de energía", que impide la compilación incremental y muestra errores de compilación.

usuario3214451
fuente
No sé por qué esta respuesta tiene un voto negativo, también responde a la pregunta, para mí fue la misma: "Modo de ahorro de energía", aunque está escrito en la configuración, pero con esta compilación automática habilitada no funciona.
Nerius Jok
1

Utilice el complemento Reformatear y compilar (inspirado en el complemento Guardar acciones de Alexandre DuBreuil):

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

Por el momento solo estoy ofreciendo un archivo jar, pero esta es la parte más importante del código:

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());
}
sbmpost
fuente
2
¿Por qué alguien descargaría un código aleatorio y lo ejecutaría?
Drew
@Drew: Acabo de subirlo a Jetbrains para su revisión. Pero si usted es paranoico supongo que se podría esperar algunos días para que esté disponible a partir de ahí ...
sbmpost
sbmpost, simplemente estoy señalando por qué algunos votarían (no es que lo hice), marcarían como No una respuesta y eliminarían esto.
Drew
Si es un código que puede publicar, en texto, eso es genial. ¿Puedes? Este es un sitio de código.
Drew
1
@drew: agregó una nota sobre el jar y agregó un poco más de contexto al código. Puede parecer de alto nivel, pero si se extiende desde FileDocumentManagerAdapter y agrega el código, (casi) tendría una clase de compilación ReformatAndCompile.
sbmpost
1

Edite su Configuración de ejecución / depuración para que la opción de compilación esté seleccionada antes de iniciar

ingrese la descripción de la imagen aquí

Después de seleccionar la opción Construir

ingrese la descripción de la imagen aquí

La solución anterior funcionó para mí mientras trabajaba en mi conjunto de pruebas JBehave

Asanka Siriwardena
fuente
Esto es bueno, pero la pregunta se refería a la compilación automática al guardar, sin tener que volver a compilar explícitamente utilizando un comando personalizado, antes de hacer algo como ejecutar una prueba, etc.,
kisna
1

No funcionaba para mí debido a que tenía un módulo innecesario en la estructura de mi proyecto. Las pruebas se ejecutaron utilizando el otro módulo, supongo.

No sé cómo terminó así, pero eliminarlo resolvió el problema.

Asegúrese de que su configuración de Ejecutar / Depurar esté utilizando el módulo que está creando con el autoguardado.

Por ejemplo: ver el módulo en

ingrese la descripción de la imagen aquí

Puede cambiar los módulos en Estructura del proyecto - Módulos

ingrese la descripción de la imagen aquí

Orkun Ozen
fuente
1

Tuve el mismo problema. Creo que sería apropiado verificar si tu clase se puede compilar o no. Haga clic en recompilar (Ctrl + Shift + F9 por defecto). Si no funciona, debe investigar por qué no se está compilando.

En mi caso, el código no se autocompilaba porque había errores ocultos con la compilación (no se mostraban en los registros en ninguna parte y la instalación limpia de Maven funcionaba). La causa raíz era Estructura del proyecto incorrecta -> Configuración de módulos, por lo que Intellij Idea no pudo construirlo de acuerdo con esta configuración.

Sergei Podlipaev
fuente
1

tuve mismo tema y también un icono de archivo problema en intellij, por lo quité el .ideaproyecto de importación de carpeta y volver resuelto mi problema.

Jacob
fuente
0

Recibí un error: algunos frascos no están en classpath, así que simplemente elimino el frasco dañado y realizo los pasos a continuación

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
Priyanshu Singh
fuente
-1

No hay suficientes puntos para comentar sobre una respuesta existente, pero similar a algunas personas anteriores, terminé agregando una macro y un mapa de teclas para Organizar importaciones / Formato / Guardar todo / FastReload (F9) / Sincronizar .

Se agrega la sincronización, ya que parece ser la única forma en que también puedo ver actualizaciones en los recursos modificados por herramientas / observadores de compilación externos (es decir, webpack).

El proceso es más lento que eclipse, y para la actualización del archivo externo a menudo tengo que ejecutar el comando varias veces, pero supongamos que puedo vivir con él.

lanza fallon
fuente