저장시 Intellij IDEA Java 클래스가 자동 컴파일되지 않음


182

어제 Eclipse에서 IntelliJ IDEA로 전환했습니다.

WebSphere Server 7에서도 JRebel을 사용하고 있습니다.

Java 파일을 수정 하고 save를 누르면 IntelliJ 가 작동하지 않는다는 점을 제외하고는 모든 것이 다소 정상적으로 작동하는 것 같습니다. JRebel이 그것을 선택하기 위해 파일을 다시 컴파일합니다.

이클립스 " 자동 빌드 "기능으로이 문제가 해결되었습니다.

IntelliJ IDEA에서 CTRL+ SHIFT+ 9를 눌러 JRebel이 관련 클래스를 다시 컴파일해야합니다. 두 파일 에서 변경이 수행되면 파일 중 하나 에서이 작업을 수행해야합니다 해야하며 IntelliJ는 모든 저장 메커니즘을 사용하기 때문에 수동으로 다시 컴파일 것을 알기가 어렵습니다.

IntelliJ가 독자적 으로이 작업수행 할 수있는 방법 없습니까?


11
Ctrl+를 누르지 F9않습니까? 그러면 전체 프로젝트가 빌드되고 두 파일 만 변경된 경우 다시 빌드됩니다.
maba

2
나는 그것이 모든 것을 재건 할까봐 두려웠다. 나는 재 구축시 디폴트는 분명한 출력이라고 생각한다. 그래서 보통 이것은 잘 작동하지 않는다 ...
mmm

5
빌드하기 전에 청소 하지 않습니다 . 증분 빌드입니다. 원하는 경우 다시 빌드 할 수 있습니다.
maba

답변:


250

업데이트

IntelliJ IDEA 12+ 릴리스의 경우 외부 컴파일러 옵션을 사용하는 경우 편집 된 소스를 자동으로 빌드 할 수 있습니다. 필요한 것은 " 컴파일러 "설정 아래에있는 " 프로젝트 자동 빌드 "옵션을 확인하는 것입니다 .

컴파일러 설정

또한 핫 배포를 원하거나 응용 프로그램이 실행되는 동안 또는 스프링 부트 devtools를 사용하는 경우 compiler.automake.allow.when.app.runningfrom 레지스트리도 활성화해야합니다 . 변경 사항이 자동으로 컴파일됩니다.

사용 Ctrl+ Shift+ A(또는 + Shift+ AMac에서) 유형을 Registry레지스트리 창이 열리면, 찾아 있도록 compiler.automake.allow.when.app.running여기를 참조 :

여기에 이미지 설명을 입력하십시오


12보다 오래된 버전의 경우 EclipseMode 플러그인을 사용하여 IDEA가 저장된 파일을 자동으로 컴파일하도록 할 수 있습니다 .

자세한 내용은 "Eclipse에서 IntelliJ IDEA로 마이그레이션" 안내서 참조하십시오 .


10
이것을 위해 플러그인을 설치해야한다는 성가신 느낌. 나는 이미 어제와 오늘에 이것을 보냈다. 나는 그들이 이것에 대한 옵션을 만들 수 있기를 바랍니다. Eclipse 가이 기능에 대한 특허를 가지고 있다고 생각하지 않습니까? CTRL + S로 다시 매핑하여 자동으로 저장되도록 할 수도 있습니다. 몇 가지 옵션을 시도해 보겠습니다. 감사합니다
mmm

14
느립니다. 너무 느립니다. 개선의 여지가 많이 있습니다! 나는 배경에서하는 것이 아니지만 Intellij가 하나의 단일 클래스에서 하나의 작은 변경 사항을 컴파일하는 데 약 3-4 초가 걸립니다. 한 클래스를 의미하는 "Compile 'StartController.java'"조차 3-4 초 밖에 걸리지 않습니다. Eclipse는 100 밀리 초 이내에이를 수행합니다. 나는 이클립스 모드 플러그인을 다시 테스트하고 무엇을 할 것인지 결정한다.
mmm

34
"프로젝트 자동 만들기"는 실행 / 디버깅하지 않을 때만 작동합니다.
xenoterracide

8
Intellij 2017.1.3 및 스프링 부트 devtools에서 작동하지 않습니다.
Nico de Wet

1
IntelliJ IDEA 2017.3.3, Java 9.0.4, Spring Boot 2.0.0.RC1, Spring devtools와 함께 작동하지 마십시오 :(
Nhu Vy

75

따르십시오 단계를 :

1-컴파일러에서 자동 작성 사용

  • 누릅니다 : ctrl+ shift+ A(Mac + shift+ A)
  • 유형: make project automatically
  • 히트: Enter
  • Make Project automatically기능 사용

2-응용 프로그램이 실행 중일 때 자동 작성 사용

  • 누릅니다 : ctrl+ shift+ A(Mac + shift+ A)
  • 유형: Registry
  • 키 찾기 compiler.automake.allow.when.app.running활성화 하거나 확인란을 클릭 옆에

참고 : 지금 응용 프로그램을 다시 시작하십시오 :)

참고 : 이것은 스프링 부트 devtools로 실시간 재로드를 허용해야합니다.


2
완벽하게, 이것은 내가 찾던 것이 었습니다 =)
eitch

3
이것은 또한 스프링 부팅 DevTools로와 인 IntelliJ의 IDEA 2016년 2월 5일과 나를 위해 일한
Xaero Degreaz

2
맞습니다. 이것은 IntelliJ 2017.1.3에서 작동하는 것 같습니다. 봄 부팅 devtools에 필요한 옵션 2이므로 옵션 2를 사용했습니다.
Nico de Wet

1
잘 작동했지만 JRebel에서 다시로드하는 데 4-5 초가 걸립니다. 그 주위에 어떤 방법이 있습니까?
user3184974

1
위의 항목 1과 2가 "옵션"이라고 생각하지 않지만 단계입니다. 둘 다해야합니다.
토마스 칼라일

67

경고

Eclipse 모드 플러그인은 더 이상 사용되지 않으며 최신 IDEA 12+ 빌드와 호환되지 않습니다. 설치하면 IDE가 모든 파일 변경에 응답하지 않고 매우 느리게 응답합니다.


IntelliJ IDEA는 자동 빌드를 사용하지 않으며 컴파일러를 통하지 않고 즉시 오류를 감지합니다. IDEA 12 에서는 Eclipse 모드와 유사합니다 .

자동으로 프로젝트 만들기

사용 Build| Make변경되고 종속 된 파일 만 컴파일하는 증분 make 프로세스를 호출합니다 (매우 빠름).

도있다 자주 묻는 질문 항목이 도움이 될 수 있습니다.

자동 작성 기능에 대한 업데이트 : 실행 / 디버그 구성이 실행 중일 때는 Make project automatically영향을 미치지 않습니다. 디스크의 클래스는 Build| Make. 디스크의 변경 사항은 항상 사용자의 통제하에 있어야합니다. 자동 make는 Eclipse 기능의 복제본이 아니며 다르게 작동하며 주된 목적은 클래스가 실제로 필요할 때 (앱 또는 테스트를 실행하기 전에) 준비 될 때까지 기다리는 시간을 절약하는 것입니다. 자동 make는이 질문에 설명 된 경우와 같이 여전히 트리거해야하는 명시 적 컴파일을 대체하지 않습니다. 다른 동작을 찾고 있다면 위의 FAQ에 링크 된 EclipseMode 플러그인이 더 나은 선택입니다.


예, 전에는 보았지만 팝업과 함께 너무 느리다고 생각했습니다. 다른 무언가를위한 것이라고 생각했습니다. CTRL + 9가 성가신 시도 althoguh를 줄 수도 있지만 CTRL + S로 다시 매핑하여 자동으로 저장할 수 있다고 생각합니다.
mmm

업데이트 해 주셔서 감사합니다. Eclipse 모드 플러그인을 설치했습니다. 대화가 없으니까 .. .. Intellij 12 ... 글쎄, 개선하고 있습니다. intellij 12도 고르지 않습니까?
mmm

3
나는 며칠 동안 12를 시험해 보았습니다. 외부 빌드 사용-> make는 자동으로 아무 작업도 실행하지 않습니다. 아무것도 일어나지 않습니다. 이클립스 모드 플러그인을 사용하면 (설정에서 활성화 / 비활성화) 잘 작동하지만 이클립스 모드 플러그인을 비활성화하고 "외부 빌드 사용-> 자동 만들기"를 활성화하면 편집 및 저장시 아무것도 발생하지 않습니다 ... 왜?
mmm

2
@CrazyCoder 방금 이것과 jRebel으로 돌아 왔습니다. 너무 느립니다. 개선의 여지가 많이 있습니다! 나는 배경에서하는 것이 아니지만 Intellij가 하나의 단일 클래스에서 하나의 작은 변경 사항을 컴파일하는 데 약 3-4 초가 걸립니다. 한 클래스를 의미하는 "Compile 'StartController.java'"조차 3-4 초 밖에 걸리지 않습니다. Eclipse는 100 밀리 초 이내에이를 수행합니다. 플러그인을 다시 테스트하고 어떤 작업을 수행할지 결정합니다.
mmm

1
@SecretService 탭 동작 제안은 youtrack.jetbrains.com/issues/IDEA 에서 환영 합니다. 고정 된 탭에 대한 몇 가지 공개 된 문제가 있으며 해당 탭을 닫을 수 없습니다.
CrazyCoder

38

ctrl+s한 번에 키맵 을 저장하고 컴파일 할 수 있습니다 . 키맵 설정으로 이동하여을 검색하십시오 Compile.


3
고마워, 나는 이것을 가장 좋아한다! intellij의 자동 컴파일과 이것도 마찬가지입니다.하지만 적어도 이제는 끝날 때가 너무 느립니다.
mmm

CTRL + S를 컴파일하도록 할당해도 디버그 버튼으로 서버가 다시 시작되지 않았습니다
Dimitri Kopriwa

Intellij 2018.2에서 작동합니다. Build Project
Neo Pham을

18

두 번의 클릭이 모두 필요하므로 실제로 차이없습니다 .

  • Eclipse : 수동 저장, 자동 컴파일.
  • IntelliJ : 자동 저장, 수동 컴파일.

가장 간단한 해결책 은 그것에 익숙해지는 것입니다. IDE에서 대부분의 낮 시간을 보낼 때 느린 습관보다 빠른 습관을 갖는 것이 더 좋습니다.


2
IntelliJ 경험을 향상시키는 방법이 있습니다 : 브라우저로 전환하는 동안 저장 및 컴파일
ruX

Eclipse에는 저장 조치를 추가 할 수있는 기능이 있으므로 가져 오기 구성 및 저장시 형식 코드와 같은 작업을 수행 할 수도 있습니다. 이러한 모든 작업을 수동으로 수행하면 상당한 수의 키 입력이 추가되고 프로세스 오류가 발생하기 쉽습니다. 예를 들어, Eclipse에서 저장시 형식화하면 형식화되지 않은 코드를 가질 수 없습니다. IntelliJ에서 형식을 잊어 버리는 것은 매우 쉽습니다.
최대

1
@Max, IntelliJ는 커밋 중에 이러한 작업을 수행합니다 (개인 취향에 가장 적합한 순간입니다). 어떤 경우에는 편집기에서 직접 코딩 스타일 문제를 강조하기도합니다 (예 : Python의 PEP8 준수).
andruso

2
하나의 IDE가 저에게 도움이되고 다른 하나가 저의 삶을 어렵게 만들지 않는 것에 익숙해지는 것은 좋은 판매 포인트가 아닙니다.
Jonathan

1
@Jonathan은 유용성을 향상시키기 위해 종종 오래된, 때로는 불필요하고 습관을 버려야합니다.
andruso

17

한 번에 저장하고 컴파일하기 위해 매크로 를 기록 하고 키 맵 Ctrl+s을 작성했습니다.


5
@SecretService 여러 동작이 동일한 바로 가기에 매핑 될 때 동작 순서가 정의되지 않으므로 모든 사람에게 작동하지 않을 수 있습니다.
Celos

13

나는 매크로를 사용하여 이것을 해결했다.

매크로 기록을 시작했습니다.

  • 편집-매크로-매크로 기록 시작을 클릭하십시오.
  • 파일-모두 저장을 클릭하십시오
  • 빌드-프로젝트 만들기를 클릭하십시오.
  • 편집-매크로-매크로 기록 중지를 클릭하십시오.

"SaveAndMake"와 같이 유용한 이름을 지정하십시오.

이제 모든 키 바인딩 저장을 제거하고 매크로에 동일한 키 바인딩을 추가하십시오!

이제 저장할 때마다 더티 컴파일을 저장하고 더티 컴파일하여 jRebel이 모든 변경 사항을 올바르게 감지합니다.


기존의 모든 저장을 대체하는 대신 매크로에 다른 키 바인딩을 제공하는 것이 좋습니다.
arcseldon

감사. 일반적인 "빌드"(다른 답변에서 제안한)로는 충분하지 않기 때문에이 솔루션을 사용하여 매번 저장하고 다시 작성합니다. 많은 자원을 소비하더라도 Eclipse 느낌을 다시 제공합니다.
Boris

5

활성화하려면 다음 단계를 신중하게 따르십시오.

1) SB V1.3으로 Spring Boot 프로젝트를 생성하고 의존성에 "Devtools"(1 *)를 추가

2) Help-> Find Action ...을 호출하고 "Registry"를 입력하십시오. 대화 상자에서 "automake"를 검색하고 " compiler.automake.allow.when.app.running " 항목을 활성화하고 대화 상자를 닫으십시오.

3) 설정-> 빌드, 실행, 배포-> 컴파일러 "자동으로 프로젝트 만들기"에서 백그라운드 컴파일을 활성화하십시오.

4) Spring Boot run config를 열고 모든 것이 올바르게 구성되면 경고 메시지가 나타납니다.

5) 앱을 실행하고 수업을 즉시 변경하십시오.

이 문제에 대한 의견으로 경험과 문제를보고하십시오.

더 많은 정보를 원하시면 여기를 클릭하십시오


여전히 "진행 중"으로 표시되어 있으며 작동하지 않습니다.
JGarrido

2

이것으로 영향을받은 maven 프로젝트에서 나를 위해 일한 유일한 것은 단위 테스트의 실행 구성에 "테스트 컴파일"목표를 추가하는 것입니다. 엄청나게 서투른 솔루션이지만 작동합니다.

여기에 이미지 설명을 입력하십시오


적어도 그것은 작동합니다 : D, 예,이 문제의 원인을 찾는 것이 좋습니다
anindis

2

다른 모듈에서 컴파일 문제가 발생하면 Intellij가 자동으로 실패한 후 자동 빌드가 수행되지 않습니다. 그래서 당신의 Problems창을 확인


1

나는 같은 문제가 있었다. "절전 모드"를 사용하여 증분 컴파일 및 컴파일 오류 표시를 방지했습니다.


나는이 답변이 다운 투표 된 이유를 알지 못하고, 질문에도 대답합니다.
Nerius Jok

1

Reformat and Compile 플러그인 (Alexandre DuBreuil의 Save Actions 플러그인에서 영감을 얻음)을 사용하십시오.

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

현재 jar 파일 만 제공하고 있지만 이것이 코드의 가장 중요한 부분입니다.

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
왜 누군가가 임의의 코드를 다운로드하여 실행합니까?
Drew

@Drew : 검토를 위해 Jetbrains에 업로드했습니다. 그러나 만약 당신이 편집증이라면 당신이 거기에서 구할 수 있기 전에 며칠을 기다릴 수 있다고 생각합니다.
sbmpost

sbmpost, 나는 왜 일부 사람들이 다운 투표하고 응답하지 않음으로 플래그 지정하고 이것을 삭제했는지를 지적하고 있습니다.
Drew

코드라면 텍스트로 게시 할 수 있습니다. 너는 할수 있니? 이것은 코드 사이트입니다.
Drew

1
@drew : jar에 대한 메모를 추가하고 코드에 약간의 컨텍스트를 추가했습니다. 높은 수준으로 보일지 모르지만 FileDocumentManagerAdapter에서 확장하여 코드를 추가하면 컴파일하는 ReformatAndCompile 클래스가 (거의) 있습니다.
sbmpost

1

실행하기 전에 빌드 옵션이 선택되도록 실행 / 디버그 구성을 편집하십시오.

여기에 이미지 설명을 입력하십시오

빌드 옵션이 선택된 후

여기에 이미지 설명을 입력하십시오

위의 솔루션은 JBehave 테스트 스위트에서 작업하는 동안 저에게 효과적이었습니다.


이것은 좋지만 문제는 테스트 실행 등과 같은 작업을 수행하기 전에 사용자 정의 명령을 사용하여 명시 적을 다시 컴파일 할 필요없이 저장시 자동 컴파일에 관한 것입니다.
적을

1

프로젝트 구조에 불필요한 모듈이있어서 작동하지 않았습니다. 테스트는 다른 모듈을 사용하여 실행되었다고 생각합니다.

나는 그것이 어떻게 그렇게 끝났는지 모르지만 그것을 제거하면 문제가 해결되었습니다.

실행 / 디버그 설정이 자동 저장으로 빌드중인 모듈을 사용하고 있는지 확인하십시오.

예 : 모듈 참조

여기에 이미지 설명을 입력하십시오

프로젝트 구조-모듈에서 모듈을 변경할 수 있습니다

여기에 이미지 설명을 입력하십시오


1

나는 같은 문제가 있었다. 클래스를 컴파일 할 수 있는지 여부를 확인하는 것이 적절하다고 생각합니다. 재 컴파일 (기본적으로 Ctrl + Shift + F9)을 클릭하십시오. 작동하지 않으면 왜 컴파일되지 않는지 조사해야합니다.

필자의 경우 컴파일시 숨겨진 오류가 있었기 때문에 코드가 자동 컴파일되지 않았습니다. 근본 원인이 잘못된 프로젝트 구조-> 모듈 구성이므로 Intellij Idea가이 구성에 따라 빌드 할 수 없었습니다.


1

intellij에 동일한 문제와 문제 파일 아이콘이 있었으므로 폴더를 제거 하고 .idea프로젝트를 다시 가져 오기하면 문제가 해결되었습니다.


0

오류가 발생했습니다 : 일부 항아리가 클래스 경로에 없습니다. 따라서 손상된 항아리를 삭제하고 아래 단계를 수행하십시오.

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

기존 답변에 대해 언급 할 점이 충분하지 않지만 위의 일부 사람들과 유사하게 매크로 및 키 맵을 추가하여 Imports / Format / SaveAll / FastReload (F9) / Synchronize 구성 합니다.

동기화는 외부 빌드 도구 / 감시자 (예 : 웹 팩)에 의해 수정 된 리소스의 업데이트를 볼 수있는 유일한 방법 인 것처럼 추가되었습니다.

프로세스는 일식보다 느리며 외부 파일을 새로 고치려면 종종 명령을 여러 번 실행해야하지만 그와 함께 살 수 있다고 가정하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.