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 ?

mmm
fonte
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
Verifique isso: stackoverflow.com/questions/19596779/…
Radu Toader 15/16

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" .

dan
fonte
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.

Snovelli
fonte
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.

CrazyCoder
fonte
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.

Daniel Kaplan
fonte
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.

andruso
fonte
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.

TonioKnight
fonte
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.

Niklas Lönn
fonte
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

Ajay Kumar
fonte
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

keyboardsamurai
fonte
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

Tworec
fonte
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.

user3214451
fonte
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());
}
sbmpost
fonte
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

Asanka Siriwardena
fonte
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

Orkun Ozen
fonte
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.

Sergei Podlipaev
fonte
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.

Jacob
fonte
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
Priyanshu Singh
fonte
-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.

lança fallon
fonte