Intellij IDEA Javaクラスが保存時に自動コンパイルされない


182

昨日、EclipseからIntelliJ IDEAに切り替えました。

JRebelをWebSphere Server 7でも使用しています。

Javaファイルを変更しsaveを押すと、IntelliJ JRebelがファイルを取得するためにファイルを再コンパイルしないことを除いて、すべてが正常に機能しているように見えます。

Eclipseの「自動ビルド」機能により、この問題は解決されました。

IntelliJ IDEAでは、私がヒットする必要がありますCTRL+ SHIFT+ 9JRebelがそれを拾うために、関連するクラスを再コンパイルします。変更が2つのファイルにまたがって行われる場合、それぞれ1つずつこれを行う必要があります。IntelliJはすべて保存メカニズムを使用するため、手動で再コンパイルする方法を知るのは非常に難しく、実際にはどちらにも興味がありません。

IntelliJが独自にこれ行う方法はありませんか?


11
Ctrl+を押してみませんF9か?これでプロジェクト全体がビルドされ、変更されたファイルが2つだけの場合、それらは再ビルドされます。
maba

2
すべてが再構築されるのではないかと心配でした。私はデフォルトが再構築時の明確な出力であると信じています...したがって、通常これはうまく機能しません...
mmm

5
ビルド前にクリーンアップしませ。インクリメンタルビルドです。必要に応じて、再構築する別の選択肢があります。
maba 2012年

このアウトをチェックしてください:stackoverflow.com/questions/19596779/...
ラドゥToader

回答:


250

更新しました

IntelliJ IDEA 12+リリースでは、外部コンパイラオプションを使用している場合、編集されたソースを自動的にビルドできます。必要なのは、「コンパイラ」設定の下にある「プロジェクトを自動的にビルドする」オプションをチェックすることだけです。

コンパイラ設定

また、アプリケーションの実行中にホットデプロイする場合や、Spring Boot 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が1つの単一クラスで1つの小さな変更をコンパイルするのに約3〜4秒かかります。「コンパイル 'StartController.java'」でも、1つのクラスは3〜4秒しかかかりません。Eclipseはこれを100ミリ秒未満で実行します。私は再びEclipseプラグインモードをテストして行くことに決めるでしょう...
うーん

34
「プロジェクトを自動的に作成」は、実行/デバッグしていない場合にのみ機能します
xenoterracide

8
Intellij 2017.1.3およびSpring Boot devtoolsでは動作しません。
Nico de Wet

1
IntelliJ IDEA 2017.3.3、Java 9.0.4、Spring Boot 2.0.0.RC1、Spring devtools :(
Do Nhu Vy

75

両方の手順に従ってください:

1-コンパイラーからAutomakeを有効にする

  • 押す:ctrl+ shift+ A(Macの場合+ shift+ A
  • タイプ: make project automatically
  • ヒット: Enter
  • Make Project automatically機能を有効にする

2-アプリケーションの実行中にAutomakeを有効にする

  • 押す:ctrl+ shift+ A(Macの場合+ shift+ A
  • タイプ: Registry
  • キーcompiler.automake.allow.when.app.runningを見つけて有効にする横にあるチェックボックスをクリックします

注:アプリケーションを今すぐ再起動してください:)

注:これにより、Spring Boot devtoolsによるライブリロードも可能になります。


2
パーフェクト、これはまさに私が探していたものでした=)
eitch

3
これは、spring-boot-devtoolsとIntelliJ IDEA 2016.2.5
Xaero Degreaz 2016年

2
そうです、これはIntelliJ 2017.1.3で動作するようです。オプション2を使用しました。これは、Spring Boot devtoolsで必要なものだからです。
ニコ・デ・ウェット

1
うまくいきましたが、JRebelでリロードするのに4-5秒かかります。それを回避する方法はありますか?
user3184974 2017

1
上記の1と2は「オプション」ではなく、ステップです。両方を行う必要があります。
トーマスカーライル

67

警告

Eclipse Modeプラグインは廃止され、最近のIDEA 12+ビルドとの互換性はありません。インストールすると、IDEはファイルが変更されるたびにハングし、応答が非常に遅くなります。


IntelliJ IDEAは自動ビルドを使用せず、コンパイラを介さずにオンザフライでエラーを検出します。Eclipseモードと同様に、IDEA 12で使用できます。

自動的にプロジェクトを作成する

使用Build| Make、変更されたファイルと依存ファイルのみをコンパイルするインクリメンタルmakeプロセスを呼び出します(非常に高速です)。

ありますFAQエントリに役立つことがあります。

自動make機能の更新:実行/デバッグ構成が実行されMake project automaticallyている場合、影響はありません。ディスク上のクラスは、Build|でのみ変更されます Make。私たちの意見では、ディスク上のクラスの変更は常にユーザーの管理下にある必要があるため、これは設計上の中心的な決定です。自動makeはEclipse機能の模倣品ではありません。動作が異なり、主な目的は、クラスが本当に必要なときに(アプリまたはテストを実行する前に)準備ができるのを待つ時間を節約することです。自動的なmakeは、この質問で説明されている場合のように、まだトリガーする必要がある明示的なコンパイルを置き換えません。別の動作を探している場合は、上記のFAQにリンクされているEclipseModeプラグインの方が適しています。


ええ、私は以前にそれを見たことがありますが、ポップアップとすべてで、遅すぎるとして却下しました。それは何か他のもののためだと思った。私はCTRL + 9が煩わしい代わりに試してみるかもしれませんが、CTRL + Sに再マップして、自動的に保存されるようにすることができると思います。
mmm 2012年

更新していただきありがとうございます。Eclipse Modeプラグインをインストールしました。そのダイアログはありません...わかりました。Intellij12 ...まあ、あなたが改善しているのはいいことです。intellij 12は均一ですか?
mmm

3
私は数日間12を試しました。外部ビルドの使用-> makeは自動的にアクションを起動しません。何も起こりません。Eclipseモードプラグイン(設定から有効/無効にする)を使用すると問題なく機能しますが、Eclipseモードプラグインを無効にして「外部ビルドの使用->自動作成」を有効にすると、編集と保存で何も起こりません...どうして?
mmm 2012年

2
@CrazyCoderこれとjRebelに戻ってきました。これは遅すぎます。改善の余地はたくさんあります!私はそれがバックグラウンドで行うことではありませんが、Intellijが1つの単一クラスで1つの小さな変更をコンパイルするのに約3〜4秒かかります。「コンパイル 'StartController.java'」でも、1つのクラスは3〜4秒しかかかりません。Eclipseはこれを100ミリ秒未満で実行します。私は再びプラグインをテストして行くことに決めるでしょう...
うーん

1
@SecretServiceタブの動作に関する提案は、youtrack.jetbrains.com / issues / IDEAで歓迎されています。固定されたタブとそれらが閉じないようにすることに関して、いくつかの未解決の問題があります。
CrazyCoder 2014

38

キーマップctrl+sを使用して、1つのステップで保存とコンパイルを行うことができます。キーマップ設定に移動して、を検索しCompileます。


3
ありがとう、私はこれが一番好きです!intellijでの自動コンパイル、およびこれも同様ですが、少なくとも今すぐ完了すると、非常に遅くなります。
mmm 2014年

動作しませんでした。CTRL+ Sをコンパイルに割り当てても、サーバーが再起動しませんでした
Dimitri Kopriwa

Intellij 2018.2で動作します。Build Project
Neo Pham

18

どちらも1クリックが必要ので、実際には違いはありません

  • Eclipse:手動保存、自動コンパイル。
  • IntelliJ:自動保存、手動コンパイル。

最も簡単な解決策は、それに慣れることです。なぜなら、昼間のほとんどの時間をIDEで過ごすときは、そのうちのいくつかでは遅い習慣よりも、速い習慣を1つで持つ方がよいからです。


2
IntelliJエクスペリエンスを向上させる方法があります。ブラウザーに切り替えながら保存してコンパイルする
ruX

Eclipseには保存アクションを追加する機能があるため、インポートの整理や保存時のコードのフォーマットなどを行うこともできます。これらすべてを手動で行うと、かなりの数のキーストロークが追加され、プロセスでエラーが発生しやすくなります。たとえば、Eclipseで保存時にフォーマットする場合、フォーマットされていないコードを使用することはできません。IntelliJでフォーマットを忘れることは非常に簡単です。
最大

1
@ Max、IntelliJはコミット中にこれらのアクションを実行します(私の個人的な好みではこれが一番です)。場合によっては、エディターでコーディングスタイルの問題を直接強調表示することもあります(PythonのPEP8準拠など)。
andruso

2
あるIDEが私のために、別のIDEがしないことで慣れることは、私の人生をより困難にし、良いセールスポイントではありません。
ジョナサン

1
@Jonathanがユーザビリティを向上させるためには、多くの場合、ユーザーの古い、しばしば不必要な習慣を取り除く必要があります。
andruso 16

17

保存してコンパイルするためのマクロを1つのステップで記録し、それにキーマップCtrl+sしました。


5
複数のアクションが同じショートカットにマップされている場合、アクションの順序が定義されていないため、@ SecretServiceが全員に機能しない場合があります。
セロス2014年

13

なんとかマクロを使って解決しました。

マクロの記録を開始しました:

  • [編集]-[マクロ]-[マクロの記録を開始]をクリックします
  • [ファイル]-[すべて保存]をクリックします
  • [ビルド-プロジェクトの作成]をクリックします
  • [編集]-[マクロ]-[マクロの記録を停止]をクリックします

「SaveAndMake」などの便利な名前を付けます。

次に、Save allキーバインドを削除し、同じキーバインドをマクロに追加します。

したがって、保存するたびに保存してダーティーコンパイルを行い、jRebelがすべての変更を正しく検出するようになりました。


既存のsave allを置き換えるのではなく、マクロに別のキーバインドを与えることをお勧めしますが、それは同様に主観的なものです。
arcseldon 2016年

ありがとう。(他の回答で示唆されているように)通常の「ビルド」では十分ではないので、このソリューションを使用して毎回保存+再ビルドします。多くのリソースを消費していても、Eclipseの感覚を取り戻します...
ボリス

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実行構成を開きます。すべてが正しく構成されている場合、警告メッセージが表示されます。

5)アプリを実行し、オンザフライでクラスを変更します

この問題に対するコメントとして、経験と問題を報告してください。

詳細はこちらをクリックしてください


それはまだ「進行中」とマークされており、私にとっては機能しません。
JGarrido 2017

2

この影響を受けた私のmavenプロジェクトで私のために機能した唯一のことは、ユニットテストの実行構成に「テストコンパイル」目標を追加することです。信じられないほど不器用なソリューションですが、機能します。

ここに画像の説明を入力してください


少なくとも、それは動作します:Dしかし、ええ、それはこの問題の原因を見つける方が良いでしょう
anindis

2

Intellijは、他のモジュールでコンパイルの問題が発生すると静かに失敗し、自動ビルドは実行されません。Problemsウィンドウを確認してください


1

同じ問題がありました。「省電力モード」を使用していたため、段階的にコンパイルしてコンパイルエラーを表示することができませんでした。


なぜこの回答が反対票を投じられたのかはわかりませんが、質問にも回答します。私にとっては同じでした。「省電力モード」ですが、設定には書き込まれていますが、これが有効になっていると自動コンパイルが機能しません。
Nerius Jok

1

(Alexandre DuBreuilのSave Actionsプラグインに触発された)Reformat and Compileプラグインを使用します。

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
なぜ誰かがランダムなコードをダウンロードして実行するのですか?
2016年

@Drew:確認のためにJetbrainsにアップロードしました。しかし、あなたが偏執的であるなら、それがそこから利用可能になるまでに数日待つことができると思います...
sbmpost

sbmpost、私はなぜ一部の人が(私がしたのではなく)反対票を投じ、なぜNot An Answerとしてフラグを立て、これを削除するのかを指摘しているだけです。
2016年

それがテキストで投稿できるコードであれば、それはすばらしいことです。あなたはできる?これはコードサイトです。
2016年

1
@drew:jarに関するメモを追加し、コードにもう少しコンテキストを追加しました。高レベルに見えるかもしれませんが、FileDocumentManagerAdapterから拡張してコードを追加すると、(ほぼ)コンパイル用のReformatAndCompileクラスができます。
sbmpost 2016年

1

実行前にビルドオプションが選択されるように実行/デバッグ構成を編集します

ここに画像の説明を入力してください

ビルドオプションが選択された後

ここに画像の説明を入力してください

上記の解決策は、JBehaveテストスイートで作業しているときに機能しました


これは良いことですが、問題は、テストの実行などを行う前に、カスタムコマンドを使用して明示的にコンパイルする必要なしに、保存時に自動コンパイルすること
でした

1

プロジェクト構造に不要なモジュールがあるため、私にとってはうまくいきませんでした。テストは他のモジュールを使用して実行されたと思います。

それがどのように終わったかはわかりませんが、削除すると問題は解決しました。

実行/デバッグ設定が、自動保存で構築しているモジュールを使用していることを確認してください。

例:モジュールを参照してください

ここに画像の説明を入力してください

プロジェクト構造-モジュールでモジュールを変更できます

ここに画像の説明を入力してください


1

同じ問題がありました。クラスをコンパイルできるかどうかをチェックするのが適切だと思います。再コンパイルをクリックします(デフォルトではCtrl + Shift + F9)。機能しない場合は、コンパイルできない理由を調査する必要があります。

私の場合、コンパイルで非表示のエラーが発生したため、コードは自動コンパイルされませんでした(それらはどこにもログに表示されず、mavenクリーンインストールが機能していました)。根本的な原因は不正なプロジェクト構造->モジュール構成だったため、Intellij Ideaはこの構成に従ってそれを構築できませんでした。


1

同じ問題があり、intellijにも問題のファイルアイコンがあったため、フォルダーを削除し.ideaプロジェクトを再インポートすると問題が解決しました。


0

エラーが発生しました:一部のjarがクラスパスにないため、破損したjarを削除して、以下の手順を実行します

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

既存の回答にコメントするのに十分なポイントではありませんが、上記の一部の人々と同様に、インポートの整理/フォーマット/すべて保存/ FastReload(F9)/同期にマクロとキーマップを追加するだけで終わりましたです。

同期は、外部ビルドツール/ウォッチャー(つまり、webpack)によって変更されたリソースの更新を確認できる唯一の方法のように追加されています。

プロセスはEclipseよりも遅く、外部ファイルの更新では、コマンドを複数回実行する必要があることがよくありますが、それでも問題ないと思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.