Classes Java Intellij IDEA não compilando automaticamente ao salvar


182

Ontem mudei para o IntelliJ IDEA do Eclipse.

Também estou usando o JRebel com o WebSphere Server 7.

Agora tudo parece estar funcionando bem, exceto que quando modifico um arquivo Java e clico em Salvar , o IntelliJ não recompila o arquivo, para que o JRebel o recolha.

O recurso " Construir automaticamente " do Eclipse resolveu esse problema.

No IntelliJ IDEA, tenho que pressionar CTRL+ SHIFT+ 9para recompilar a classe relevante para o JRebel buscá-la. Se forem feitas alterações em dois arquivos , eu tenho que fazer isso em cada um deles e, como o IntelliJ usa o mecanismo salvar tudo, é muito difícil saber o que recompilar manualmente, o que também não estou interessado em fazer.

Não existe uma maneira de fazer o IntelliJ fazer isso sozinho ?


11
Por que você não apenas pressiona Ctrl+ F9? Isso criará o projeto inteiro e, se apenas dois arquivos forem alterados, eles serão reconstruídos.
— fácil

2
Eu tinha medo que reconstruísse tudo. Eu acredito que o padrão é a saída clara sobre reconstruir ... então normalmente isto não trabalho para boa ...
— mmm

5
Ele não limpar antes de construir. É uma construção incremental. Você tem outra opção para reconstruir, se desejar.
— Maba

Respostas:


250

ATUALIZADA

Para versões do IntelliJ IDEA 12+, podemos criar automaticamente as fontes editadas se estivermos usando a opção de compilador externo. A única coisa necessária é verificar a opção " Compilar projeto automaticamente ", localizada nas configurações de " Compilador ":

Configurações do compilador

Além disso, se você deseja implantar a quente, enquanto o aplicativo estiver em execução ou se estiver usando o Spring Boot Devtools, também deverá ativar o compiler.automake.allow.when.app.runningregistro from. Isso irá compilar automaticamente suas alterações.

Usando o tipo Ctrl+ Shift+ A(ou ⌘+ Shift+ Ano Mac) Registryquando a janela do registro estiver aberta, localize e ative compiler.automake.allow.when.app.running, veja aqui:

insira a descrição da imagem aqui


Para versões anteriores a 12, é possível usar o plug-in EclipseMode para fazer o IDEA compilar automaticamente os arquivos salvos.

Para obter mais dicas, consulte o guia "Migrando do Eclipse para o IntelliJ IDEA" .


10
Parece chato que eu tenho que instalar um plugin para isso. Eu já passei ontem e hoje nisso. Eu gostaria que eles pudessem criar uma opção para isso, não acho que o Eclipse tenha uma patente sobre esse recurso, não é? Eu também poderia remapear para CTRL + S para fazer como ele salva automaticamente. Vou tentar algumas opções. obrigado
— mmm

14
Isso é lento. Isso é muito lento. Há muito espaço para melhorias! Não sou o que faz em segundo plano, mas a Intellij leva de três a quatro segundos para compilar uma pequena alteração em uma única classe. Até o "Compile 'StartController.java'", significando que uma classe leva apenas 3-4 segundos. O Eclipse faz isso em menos de 100 milissegundos. Vou testar o modo eclipse Plugin novamente e decidir o que ir com ..
— mmm

34
"projecto automaticamente fazer" só funciona quando não estiver executando / depuração
— xenoterracide

8
Não funciona para mim com o Intellij 2017.1.3 e os devtools de inicialização por mola.
— Nico de Wet

1
Não trabalhe com o IntelliJ IDEA 2017.3.3, Java 9.0.4, Spring Boot 2.0.0.RC1, Spring devtools :(
— Do Nhu Vy

75

Por favor, siga os dois passos:

1 - Habilite o Automake a partir do compilador

  • Pressione: ctrl+ shift+ A(Para Mac ⌘+ shift+ A)
  • Tipo: make project automatically
  • Acertar: Enter
  • Ativar Make Project automaticallyrecurso

2 - Ativar Automake quando o aplicativo estiver sendo executado

  • Pressione: ctrl+ shift+ A(Para Mac ⌘+ shift+ A)
  • Tipo: Registry
  • Encontre a chave compiler.automake.allow.when.app.runninge ative-a ou clique na caixa de seleção ao lado dela

Nota: Reinicie seu aplicativo agora :)

Nota: Isso também deve permitir recarga ao vivo com os devtools de inicialização por mola.


2
Perfeito, isso era exatamente o que eu estava procurando =)
— eitch

3
Isso também funcionou para mim com o spring-boot-devtools e o IntelliJ IDEA 2016.2.5
— Xaero Degreaz

2
Certo, isso parece funcionar no IntelliJ 2017.1.3, usei a opção 2, pois é disso que precisamos com os devtools de inicialização por mola.
— Nico de Wet

1
Funcionou bem, mas leva 4-5 segundos para recarregar no JRebel. Alguma maneira de contornar isso?
— user3184974

1
Eu não acho que os itens 1 e 2 acima são "opções", mas são etapas. Você precisa fazer as duas coisas.
— Thomas Carlisle

67

AVISO

O plug-in do Modo Eclipse é obsoleto e não é compatível com as recentes compilações do IDEA 12+. Se você instalá-lo, o IDE travará em todas as alterações de arquivo e responderá extremamente lento.


O IntelliJ IDEA não usa compilação automática, ele detecta erros em tempo real, não via compilador. Semelhante ao modo Eclipse estará disponível no IDEA 12 :

Criar projeto automaticamente

Use Build|Make, ele invoca o processo de criação incremental que compila apenas arquivos alterados e dependentes (é muito rápido).

Há também uma entrada de perguntas frequentes que pode ajudar.

Atualização no recurso de criação automática : Quando a configuração de execução / depuração está em execução, Make project automaticallynão tem efeito. Classes no disco serão alteradas apenas em Build| Make. É a decisão principal do projeto, pois, em nossa opinião, as alterações de classe no disco devem estar sempre sob o controle do usuário. O make automático não é o imitador do recurso Eclipse, funciona de maneira diferente e seu principal objetivo é economizar tempo aguardando que as classes estejam prontas quando realmente são necessárias (antes de executar o aplicativo ou os testes). A criação automática não substitui a compilação explícita que você ainda precisa acionar, como no caso descrito nesta pergunta. Se você estiver procurando um comportamento diferente, o plug-in EclipseMode vinculado na FAQ acima seria uma escolha melhor.


Sim, eu já tinha visto isso antes, mas o descartei como muito lento, com o pop-up e tudo. Pensei que era para outra coisa. Eu poderia tentar, apesar de um CTRL + 9 é irritante, mas acho que eu poderia remapear para CTRL + S para fazer, pois ele salva automaticamente.
— mmm

Obrigado pela atualização. Eu instalei o plug-in do modo Eclipse. Não tenha esse diálogo ... Ook .. Intellij 12 ... bom, você está melhorando. O intellij 12 está de fora?
— mmm

3
Eu tenho experimentado 12 por um par de dias. O uso externo build -> make automaticamente não dispara nenhuma ação. Nada acontece. Quando uso o plug-in do modo eclipse (ative / desative-o das configurações) que funciona bem, mas quando desativo o plug-in do modo eclipse e ative "use build externo -> make automático" nada acontece na edição e no salvamento ... porque?
— Mmm

2
@CrazyCoder Acabei de voltar a isso e ao jRebel. Isso é muito lento. Há muito espaço para melhorias! Não sou o que faz em segundo plano, mas a Intellij leva de três a quatro segundos para compilar uma pequena alteração em uma única classe. Até o "Compile 'StartController.java'", significando que uma classe leva apenas 3-4 segundos. O Eclipse faz isso em menos de 100 milissegundos. Vou testar o plug-in novamente e decidir o que fazer ..
— mmm

1
As sugestões de comportamento da guia @SecretService são bem-vindas em youtrack.jetbrains.com/issues/IDEA . Já existem vários problemas em aberto sobre guias fixadas e impedindo que elas sejam fechadas.
— CrazyCoder

38

Você pode mapear as teclas ctrl+spara salvar E compilar em uma etapa. Vá para as configurações do mapa de teclas e procure Compile.


3
Obrigado, eu gosto mais disso! A compilação automática em intellij, e esta também, mas pelo menos vejo quando termina agora, é muito lenta.
— mmm

Não funcionou para mim, atribuindo CTRL + S para compilar não reiniciar o meu início servidor com o botão de depuração
— Dimitri Kopriwa

Funciona para mim, Intellij 2018.2. Ele deve procurar o Build Project
— Neo Pham

18

Na verdade, não há diferença, pois ambos exigem 1 clique:

  • Eclipse : salvamento manual, compilação automática.
  • IntelliJ : salvamento automático, compilação manual.

A solução mais simples é apenas para se acostumar. Porque quando você passa a maior parte do dia no IDE, é melhor ter hábitos rápidos em um do que hábitos lentos em vários deles.


2
Há maneira de melhorar a experiência do IntelliJ: salvar e compilar enquanto você mudar para o navegador
— Rux

O Eclipse tem a capacidade de adicionar ações de salvamento. Você também pode fazer coisas como organizar importações e formatar o código ao salvar. Fazer tudo isso manualmente adiciona um número significativo de pressionamentos de tecla e torna o processo mais propenso a erros. Por exemplo, você nunca poderá ter código não formatado se formatar ao salvar no Eclipse. É muito fácil esquecer a formatação no IntelliJ.
— Max

1
@ Max, IntelliJ executa essas ações durante o commit (que, para meu gosto pessoal, é o melhor momento). Em alguns casos, também destaca problemas de estilo de codificação diretamente no editor (por exemplo, conformidade com PEP8 para python).
— andruso

2
Acostumar-se a algo que um IDE faz por mim e outro não, tornando minha vida mais difícil, não é um bom ponto de venda.
— Jonathan

1
O Jonathan Jonathan para melhorar a usabilidade muitas vezes requer a remoção de hábitos antigos, muitas vezes desnecessários, para os usuários.
— andruso

17

Acabei gravando uma macro para salvar e compilar em uma etapa e o mapa Ctrl+sde teclas para ela.


5
@SecretService Pode não funcionar para todos, pois a ordem das ações não é definida quando várias ações são mapeadas para o mesmo atalho.
— Celos 23/05

13

Eu consegui resolver isso usando macros.

Comecei a gravar uma macro:

  • Clique em Editar - Macros - Iniciar gravação de macro
  • Clique em Arquivo - Salvar tudo
  • Clique em Build - Make Project
  • Clique em Editar - Macros - Parar gravação de macro

Nomeie algo útil como "SaveAndMake".

Agora basta remover a opção Salvar todas as combinações de teclas e adicionar a mesma combinação de teclas à sua macro!

Então agora, toda vez que eu salvo, ele salva e faz uma compilação suja, e o jRebel agora detecta todas as alterações corretamente.


Sugeriria dar à macro uma combinação de teclas diferente, em vez de substituir todas existentes, exceto todas - mas isso é igualmente subjetivo.
— Arcseldon 22/05

Obrigado. Como um "Build" normal (como sugerido pelas outras respostas) não é suficiente para mim, eu uso esta solução para salvar + reconstruir sempre. Devolve-me a sensação do Eclipse, mesmo que consuma muitos recursos ...
— Boris

5

Por favor, siga estas etapas cuidadosamente para habilitá-lo.

1) crie o projeto Spring Boot com o SB V1.3 e adicione "Devtools" (1 *) às dependências

2) chame Ajuda-> Localizar Ação ... e digite "Registro", na caixa de diálogo, procure por "automake" e ative a entrada " compiler.automake.allow.when.app.running ", feche a caixa de diálogo

3) habilite a compilação em segundo plano em Configurações-> Compilar, Execução, Implantação-> Compilador "Criar projeto automaticamente"

4) abra a configuração de execução do Spring Boot, você receberá uma mensagem de aviso se tudo estiver configurado corretamente

5) Execute seu aplicativo, mude suas aulas on-the-fly

Por favor, relate suas experiências e problemas como comentários para esse problema.

Clique aqui para mais informações


Está marcado como ainda "Em andamento" e não funciona para mim.
— JGarrido

2

A única coisa que funcionou para mim no meu projeto maven que foi afetado por isso é adicionar uma meta de "compilação de teste" à configuração de execução dos meus testes de unidade. Solução incrivelmente desajeitada, mas funciona.

insira a descrição da imagem aqui


pelo menos ele funciona: D, mas sim, é melhor para encontrar uma fonte do problema
— anindis

2

O Intellij falha silenciosamente quando encontra um problema de compilação em outro módulo e a compilação automática não é executada. Então verifique sua Problemsjanela


1

Eu tive o mesmo problema. Eu estava usando o "Modo de economia de energia", que impede a compilação incremental e mostra erros de compilação.


Não sei por que essa resposta foi rebaixada, ela também responde à pergunta, pois para mim era a mesma - "Modo de economia de energia", embora tenha sido escrito nas configurações, mas com essa compilação automática ativada não funcione.
— Nerius Jok

1

Use o plug-in Reformatar e Compilar (inspirado no plug-in Salvar Ações de Alexandre DuBreuil):

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

No momento, estou oferecendo apenas um arquivo jar, mas esta é a parte mais importante do 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());
}

2
Por que alguém faria o download de algum código aleatório e o executaria?
— Drew

@ Drew: Enviei para Jetbrains para revisão. Mas se você é paranóico Eu suponho que você poderia esperar alguns dias antes de estar disponível a partir de lá ...
— sbmpost

sbmpost, estou apenas apontando por que alguns (não o fiz) reduziram a votação, sinalizaram como Não é uma resposta e obtiveram essa exclusão.
— Drew

Se for um código, você pode postar, em texto, isso é ótimo. Você pode? Este é um site de códigos.
— Drew

1
@ drew: adicionou nota sobre o jar e adicionou um pouco mais de contexto ao código. Pode parecer alto, mas se você estender do FileDocumentManagerAdapter e adicionar o código, terá (quase) uma classe ReformatAndCompile compilada.
— Sbmpost

1

Edite sua Configuração de Execução / Depuração para que a opção Compilar esteja selecionada antes de iniciar

insira a descrição da imagem aqui

Depois que a opção Compilar estiver selecionada

insira a descrição da imagem aqui

A solução acima funcionou para mim enquanto trabalhava no meu conjunto de testes JBehave


isso é bom, mas a questão era de cerca de auto compilar em salvar, sem ter que compilar explicitamente novamente usando um comando personalizado, antes de fazer qualquer coisa como execução de um teste, etc.,
— Kisna

1

Não estava funcionando para mim devido a um módulo desnecessário na estrutura do meu projeto. Os testes foram executados usando o outro módulo, suponho.

Não sei como acabou assim, mas removê-lo resolveu o problema.

Verifique se as configurações de Executar / Depurar estão usando o módulo que você está construindo com o salvamento automático.

Por exemplo: veja o módulo em

insira a descrição da imagem aqui

Você pode alterar os módulos em Estrutura do projeto - Módulos

insira a descrição da imagem aqui


1

Eu tive o mesmo problema. Eu acho que seria apropriado verificar se sua classe pode ser compilada ou não. Clique em recompilar (Ctrl + Shift + F9 por padrão). Se não está funcionando, você deve investigar por que não está compilando.

No meu caso, o código não era de compilação automática porque havia erros ocultos na compilação (eles não eram mostrados nos logs em nenhum lugar e a instalação limpa do maven estava funcionando). A causa raiz estava incorreta na Estrutura do Projeto -> Configuração dos módulos, portanto, o Intellij Idea não conseguiu construí-lo de acordo com esta configuração.


1

Eu tive o mesmo problema e também um ícone de arquivo de problema no intellij, então removi a .ideapasta e reimporte o projeto resolvi o meu problema.


0

Eu estava recebendo erro: alguns jars não estão no caminho de classe. Então, apenas apague o jar corrompido e execute-o abaixo das etapas

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

Não há pontos suficientes para comentar uma resposta existente, mas semelhante a algumas pessoas acima, acabei adicionando uma macro e um mapa de teclas para Organizar importações / Formato / Salvar / FastReload (F9) / Sincronizar .

A sincronização é adicionada, pois parece ser a única maneira de também ver atualizações nos recursos modificados por ferramentas / observadores de construção externos (por exemplo, webpack).

O processo é mais lento que o eclipse - e para a atualização de arquivos externos, muitas vezes é necessário executar o comando várias vezes - mas suponha que eu possa conviver com ele.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.