Intellij IDEA kelas Java tidak secara otomatis mengkompilasi pada save


182

Kemarin saya beralih ke IntelliJ IDEA dari Eclipse.

Saya menggunakan JRebel dengan WebSphere Server 7 juga.

Segalanya sekarang tampaknya berfungsi agak baik, kecuali ketika saya memodifikasi file Java, dan tekan save , IntelliJ tidak mengkompilasi ulang file tersebut, agar JRebel mengambilnya.

Fitur Eclipse " Build Automatically " menyelesaikan masalah ini.

Di IntelliJ IDEA, saya harus menekan CTRL+ SHIFT+ 9untuk mengkompilasi ulang kelas yang relevan untuk JRebel untuk mengambilnya. Jika perubahan dilakukan di dua file , saya harus melakukan ini pada masing-masing dan satu dari mereka dan karena IntelliJ menggunakan mekanisme save all, sangat sulit untuk mengetahui apa yang harus dikompilasi ulang secara manual yang saya tidak benar-benar tertarik melakukan keduanya.

Apakah tidak ada cara untuk membuat IntelliJ melakukan ini sendiri ?


11
Mengapa Anda tidak menekan Ctrl+ saja F9? Itu akan membangun seluruh proyek dan jika hanya dua file telah berubah maka mereka akan dibangun kembali.
maba

2
Saya takut itu akan membangun kembali semua. Saya percaya default adalah output yang jelas pada pembangunan kembali ... jadi biasanya ini tidak bekerja dengan baik ...
mmm

5
Itu tidak bersih sebelum membangun. Itu membangun tambahan. Anda punya pilihan lain untuk membangun kembali jika diinginkan.
maba

Jawaban:


250

DIPERBARUI

Untuk rilis IntelliJ IDEA 12+ kami dapat membangun sumber yang diedit secara otomatis jika kami menggunakan opsi kompiler eksternal. Satu-satunya hal yang diperlukan adalah memeriksa opsi " Bangun proyek secara otomatis ", yang terletak di bawah pengaturan " Penyusun ":

Pengaturan Kompilator

Juga, jika Anda ingin menyebarkan panas, saat aplikasi sedang berjalan atau jika Anda menggunakan spring boot devtools Anda harus mengaktifkan compiler.automake.allow.when.app.runningdari registry juga. Ini secara otomatis akan mengkompilasi perubahan Anda.

Menggunakan Ctrl+ Shift+ A(atau + Shift+ Adi Mac) ketik Registrybegitu jendela registri terbuka, temukan dan aktifkan compiler.automake.allow.when.app.running, lihat di sini:

masukkan deskripsi gambar di sini


Untuk versi yang lebih tua dari 12, Anda dapat menggunakan plugin EclipseMode untuk membuat IDEA secara otomatis mengkompilasi file yang disimpan.

Untuk kiat lainnya, lihat panduan "Migrasi Dari Eclipse ke IntelliJ IDEA" .


10
Terasa menyebalkan karena saya harus menginstal plugin untuk ini. Saya sudah menghabiskan kemarin dan hari ini untuk ini. Saya berharap mereka bisa membangun opsi untuk ini, saya tidak berpikir Eclipse memiliki paten pada fitur ini, bukan? Saya juga bisa memetakan kembali ke CTRL + S untuk membuatnya karena menyimpan secara otomatis. Saya akan mencoba beberapa opsi. terima kasih
mmm

14
Ini lambat. Ini terlalu lambat. Ada banyak ruang untuk perbaikan! Saya bukan apa yang dilakukannya di latar belakang, tetapi butuh Intellij sekitar 3-4 detik untuk mengkompilasi satu perubahan kecil dalam satu kelas tunggal. Bahkan "Kompilasi 'StartController.java'" yang berarti satu kelas hanya membutuhkan waktu 3-4 detik. Eclipse melakukan ini dalam waktu kurang dari 100 milidetik. Saya akan menguji plugin mode gerhana lagi dan memutuskan apa yang harus saya lakukan ..
mmm

34
"membuat proyek secara otomatis" hanya berfungsi ketika tidak menjalankan / debugging
xenoterracide

8
Tidak bekerja untuk saya dengan Intellij 2017.1.3 dan spring boot devtools.
Nico de Wet

1
Jangan bekerja dengan IntelliJ IDEA 2017.3.3, Java 9.0.4, Spring Boot 2.0.0.RC1, Spring devtools :(
Do Nhu Vy

75

Harap ikuti kedua langkah:

1 - Aktifkan Automake dari kompiler

  • Tekan: ctrl+ shift+ A(Untuk Mac + shift+ A)
  • Tipe: make project automatically
  • Memukul: Enter
  • Aktifkan Make Project automaticallyfitur

2 - Aktifkan Automake saat aplikasi sedang berjalan

  • Tekan: ctrl+ shift+ A(Untuk Mac + shift+ A)
  • Tipe: Registry
  • Temukan kunci compiler.automake.allow.when.app.runningdan aktifkan atau klik kotak centang di sebelahnya

Catatan: Mulai ulang aplikasi Anda sekarang :)

Catatan: Ini juga harus memungkinkan reload langsung dengan devtool booting pegas.


2
Sempurna, ini hanya apa yang saya cari =)
eitch

3
Ini juga bekerja untuk saya dengan spring-boot-devtools dan IntelliJ IDEA 2016.2.5
Xaero Degreaz

2
Benar, jadi ini sepertinya berfungsi pada IntelliJ 2017.1.3, saya menggunakan opsi 2 karena inilah yang dibutuhkan oleh devtools booting musim semi.
Nico de Wet

1
Bekerja dengan baik tetapi butuh 4-5 detik untuk memuat ulang di JRebel. Ada jalan lain?
user3184974

1
Saya tidak berpikir item 1 & 2 di atas adalah "opsi", tetapi langkah-langkahnya. Anda harus melakukan keduanya.
Thomas Carlisle

67

PERINGATAN

Plug-in Mode Eclipse sudah usang dan tidak kompatibel dengan build IDEA 12+ terbaru. Jika Anda menginstalnya, IDE akan menunggu setiap perubahan file dan akan merespons sangat lambat.


IntelliJ IDEA tidak menggunakan pembuatan otomatis, mendeteksi kesalahan dengan cepat, bukan melalui kompiler. Mirip dengan mode Eclipse akan tersedia di IDEA 12 :

Buat proyek secara otomatis

Gunakan Build| Make, ia memanggil proses make tambahan yang hanya akan mengkompilasi file yang diubah dan bergantung (ini sangat cepat).

Ada juga entri FAQ yang dapat membantu.

Pembaruan pada fitur make otomatis : Ketika konfigurasi run / debug dijalankan, Make project automaticallytidak berpengaruh. Kelas pada disk hanya akan berubah pada Build| Make. Ini adalah keputusan desain inti karena perubahan kelas pendapat kami pada disk harus selalu di bawah kendali pengguna. Make otomatis bukanlah peniru fitur Eclipse, ini berfungsi secara berbeda dan tujuan utamanya adalah untuk menghemat waktu menunggu kelas siap ketika mereka benar-benar diperlukan (sebelum menjalankan aplikasi atau tes). Make otomatis tidak menggantikan kompilasi eksplisit yang masih perlu Anda memicu seperti dalam kasus yang dijelaskan dalam pertanyaan ini. Jika Anda mencari perilaku berbeda, plug-in EclipseMode yang tertaut dalam FAQ di atas akan menjadi pilihan yang lebih baik.


Ya, saya pernah melihatnya sebelumnya, tetapi menganggapnya terlalu lambat, dengan popup dan sebagainya. Kupikir itu untuk hal lain. Saya mungkin mencoba althoguh CTRL + 9 itu mengganggu, tapi saya kira saya bisa memetakan kembali ke CTRL + S untuk membuatnya karena menyimpan secara otomatis.
mmm

Terima kasih atas pembaruannya. Saya telah menginstal plugin Mode Eclipse. Tidak memiliki dialog itu ... Ook .. Intellij 12 ... baik, bagus bahwa Anda meningkatkan. Apakah Intellij 12 keluar?
mmm

3
Saya telah mencoba 12 selama beberapa hari. Penggunaan eksternal build -> make secara otomatis tidak memecat tindakan apa pun. Tidak ada yang terjadi. Ketika saya menggunakan plugin mode eclipse (aktifkan / nonaktifkan dari pengaturan) yang berfungsi dengan baik, tetapi ketika saya menonaktifkan plugin mode eclipse dan aktifkan "gunakan build eksternal -> auto make" tidak ada yang terjadi pada edit dan simpan ... ada ide untuk Mengapa?
mmm

2
@CrazyCoder Saya baru saja kembali ke ini dan jRebel. Ini terlalu lambat. Ada banyak ruang untuk perbaikan! Saya bukan apa yang dilakukannya di latar belakang, tetapi butuh Intellij sekitar 3-4 detik untuk mengkompilasi satu perubahan kecil dalam satu kelas tunggal. Bahkan "Kompilasi 'StartController.java'" yang berarti satu kelas hanya membutuhkan waktu 3-4 detik. Eclipse melakukan ini dalam waktu kurang dari 100 milidetik. Saya akan menguji plugin lagi dan memutuskan apa yang harus saya lakukan ..
mmm

1
Saran perilaku tab @SecretService dipersilakan di youtrack.jetbrains.com/issues/IDEA . Sudah ada beberapa masalah terbuka tentang tab yang disematkan dan mencegahnya agar tidak ditutup.
CrazyCoder

38

Anda dapat keymap ctrl+suntuk menyimpan DAN mengkompilasi dalam satu langkah. Buka pengaturan keymap dan cari Compile.


3
Terima kasih, saya suka yang terbaik ini! Kompilasi otomatis di intellij, dan yang ini juga, tapi setidaknya saya melihat ketika selesai sekarang, terlalu lambat.
mmm

Tidak bekerja untuk saya, menugaskan CTRL + S untuk mengkompilasi tidak me-restart server saya mulai dengan tombol debug
Dimitri Kopriwa

Ini bekerja untuk saya, Intellij 2018.2. Seharusnya mencari Build Project
Neo Pham

18

Sebenarnya tidak ada perbedaan karena keduanya membutuhkan 1 klik:

  • Eclipse : Simpan secara manual, kompilasi otomatis.
  • IntelliJ : Simpan otomatis, kompilasi manual.

Solusi paling sederhana hanyalah membiasakan diri dengannya. Karena ketika Anda menghabiskan sebagian besar siang hari Anda di IDE, maka lebih baik memiliki kebiasaan cepat dalam satu daripada kebiasaan lambat di beberapa dari mereka.


2
Ada cara untuk meningkatkan pengalaman IntelliJ: menyimpan dan mengkompilasi saat Anda beralih ke browser
ruX

Eclipse memiliki kemampuan untuk menambahkan tindakan save, Anda juga dapat melakukan hal-hal seperti mengatur impor dan memformat kode pada save. Melakukan semua hal ini secara manual menambah sejumlah penekanan tombol dan membuat proses lebih rentan kesalahan. Misalnya, Anda tidak akan pernah memiliki kode yang tidak diformat jika Anda memformat simpan di Eclipse. Sangat mudah untuk melupakan pemformatan di IntelliJ.
Maks

1
@ Max, IntelliJ menjalankan tindakan-tindakan itu selama komit (yang menurut selera pribadi saya adalah momen terbaik). Dalam beberapa kasus ini juga menyoroti masalah gaya pengkodean langsung di editor (mis. Kesesuaian PEP8 untuk python).
andruso

2
Membiasakan diri dengan sesuatu yang satu IDE lakukan untuk saya dan yang lainnya tidak, membuat hidup saya lebih sulit, bukanlah titik penjualan yang baik.
Jonathan

1
@Jonathan meningkatkan kegunaan sangat sering membutuhkan kebiasaan lama untuk ditinggalkan, seringkali tidak perlu, bagi pengguna.
andruso

17

Saya akhirnya merekam Makro untuk disimpan dan dikompilasi dalam satu langkah, dan keymap Ctrl+suntuk itu.


5
@SecretService Mungkin tidak berfungsi untuk semua orang, karena urutan tindakan tidak ditentukan ketika beberapa tindakan dipetakan ke jalan pintas yang sama.
Celos

13

Saya berhasil menyelesaikan ini menggunakan makro.

Saya mulai merekam makro:

  • Klik Edit - Makro - Mulai perekaman makro
  • Klik File - Simpan Semua
  • Klik Bangun - Buat Proyek
  • Klik Edit - Makro - Hentikan perekaman makro

Beri nama sesuatu yang bermanfaat seperti, "SaveAndMake".

Sekarang hapus saja Save all keybinding, dan tambahkan keybinding yang sama ke makro Anda!

Jadi sekarang, setiap kali saya menyimpan, menyimpan dan membuat kompilasi kotor, dan jRebel sekarang mendeteksi semua perubahan dengan benar.


Sarankan memberi makro keybinding yang berbeda daripada mengganti save all - tapi itu sama-sama subjektif.
arcseldon

Terima kasih. Karena "Build" yang normal (seperti yang disarankan oleh jawaban lain) bahkan tidak cukup untuk saya, saya menggunakan solusi ini untuk menyimpan + membangun kembali setiap waktu. Memberi saya kembali perasaan Eclipse, bahkan jika itu menghabiskan banyak sumber daya ...
Boris

5

Harap ikuti langkah-langkah ini dengan seksama untuk mengaktifkannya.

1) buat proyek Spring Boot dengan SB V1.3 dan tambahkan "Devtools" (1 *) ke dependensi

2) memohon Bantuan-> Temukan Tindakan ... dan ketik "Registry", dalam dialog cari "automake" dan aktifkan entri " compiler.automake.allow.when.app.running ", tutup dialog

3) aktifkan kompilasi latar belakang di Pengaturan-> Bangun, Eksekusi, Deployment-> Kompiler "Buat proyek secara otomatis"

4) buka Spring Boot run config, Anda harus mendapatkan pesan peringatan jika semuanya dikonfigurasi dengan benar

5) Jalankan aplikasi Anda, ubah kelas saat bepergian

Silakan laporkan pengalaman dan masalah Anda sebagai komentar untuk masalah ini.

klik di sini untuk info lebih lanjut


Itu ditandai sebagai masih "Dalam Kemajuan", dan tidak bekerja untuk saya.
JGarrido

2

Satu-satunya hal yang bekerja untuk saya dalam proyek pakar saya yang terpengaruh oleh ini adalah menambahkan tujuan "test-compile" ke konfigurasi menjalankan tes unit saya. Solusi yang sangat kikuk, tetapi berhasil.

masukkan deskripsi gambar di sini


setidaknya itu berfungsi: D tapi ya, lebih baik untuk menemukan sumber masalah ini
anindis

2

Intellij gagal diam-diam ketika menemukan masalah kompilasi dalam modul lain, dan kemudian membangun otomatis tidak dilakukan. Jadi periksa Problemsjendelamu


1

Saya memiliki masalah yang sama. Saya menggunakan "Mode hemat daya", yang mencegah kompilasi secara bertahap dan menunjukkan kesalahan kompilasi.


Saya tidak tahu mengapa jawaban ini diturunkan, itu juga menjawab pertanyaan, bagi saya adalah sama - "Mode hemat daya", meskipun ditulis dalam pengaturan, tetapi dengan kompilasi otomatis yang diaktifkan ini tidak berfungsi.
Nerius Jok

1

Gunakan plugin Reformat dan Kompilasi (terinspirasi oleh plugin Save Actions dari Alexandre DuBreuil):

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

Saat ini saya hanya menawarkan file jar, tetapi ini adalah bagian terpenting dari kode:

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
Mengapa ada yang mengunduh beberapa kode acak dan menjalankannya?
Drew

@Drew: Baru diunggah ke Jetbrains untuk diperiksa. Tetapi jika Anda paranoid saya kira Anda bisa menunggu beberapa hari sebelum tersedia dari sana ...
sbmpost

sbmpost, saya hanya menunjukkan mengapa beberapa orang akan (bukan yang saya lakukan) menurunkan suara, menandai sebagai Bukan Jawaban, dan menghapus ini.
Drew

Jika ini adalah kode yang dapat Anda kirim, dalam teks, itu hebat. Bisakah kamu? Ini adalah situs kode.
Drew

1
@drew: menambahkan catatan tentang toples dan menambahkan sedikit lebih banyak konteks ke kode. Ini mungkin terlihat tingkat tinggi, tetapi jika Anda memperluas dari FileDocumentManagerAdapter dan menambahkan kode, Anda (hampir) akan memiliki kelas ReformatAndCompile kompilasi.
sbmpost

1

Edit Konfigurasi Run / Debug Anda sehingga opsi Build dipilih sebelum diluncurkan

masukkan deskripsi gambar di sini

Setelah opsi Bangun dipilih

masukkan deskripsi gambar di sini

Solusi di atas bekerja untuk saya saat mengerjakan test suite JBehave saya


ini bagus, tetapi pertanyaannya adalah tentang kompilasi otomatis pada save, tanpa harus mengkompilasi kejelasan lagi menggunakan perintah kustom, sebelum melakukan apapun seperti menjalankan tes, dll.
kisna

1

Itu tidak berfungsi untuk saya karena memiliki modul yang tidak perlu dalam struktur proyek saya. Tes dieksekusi menggunakan modul lain, saya kira.

Saya tidak tahu bagaimana akhirnya seperti itu tetapi menghapusnya memecahkan masalah.

Pastikan pengaturan Run / Debug Anda menggunakan modul yang Anda buat dengan penyimpanan otomatis.

Contoh: lihat modul di

masukkan deskripsi gambar di sini

Anda dapat mengubah modul dalam Struktur Proyek - Modul

masukkan deskripsi gambar di sini


1

Saya memiliki masalah yang sama. Saya pikir akan tepat untuk memeriksa apakah kelas Anda dapat dikompilasi atau tidak. Klik kompilasi ulang (Ctrl + Shift + F9 secara default). Jika tidak berfungsi maka Anda harus menyelidiki mengapa itu tidak dikompilasi.

Dalam kasus saya kode tidak kompilasi otomatis karena ada kesalahan tersembunyi dengan kompilasi (mereka tidak ditampilkan di log di mana saja dan maven clean-install berfungsi). Rootcause tidak benar pada Struktur Proyek -> Konfigurasi modul, jadi Intellij Idea tidak dapat membangunnya sesuai dengan konfigurasi ini.


1

saya punya masalah yang sama dan juga file icon masalah dalam intellij, jadi saya dihapus dengan .ideafolder dan re proyek impor memecahkan masalah saya.


0

Saya mendapatkan kesalahan: beberapa stoples tidak ada di classpath. Jadi saya hanya menghapus toples yang rusak dan melakukan perrform di bawah langkah-langkah ini

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

Tidak cukup poin untuk mengomentari jawaban yang ada, tetapi mirip dengan beberapa orang di atas, saya akhirnya hanya menambahkan makro & keymap untuk Mengatur Impor / Format / SaveAll / FastReload (F9) / Sinkronisasi .

Sinkronisasi ditambahkan karena tampaknya menjadi satu-satunya cara saya juga dapat melihat pembaruan dalam sumber daya yang dimodifikasi oleh alat / pengamat pembuatan eksternal (yaitu, webpack).

Prosesnya lebih lambat daripada gerhana - dan untuk penyegaran file eksternal sering harus menjalankan perintah beberapa kali - tetapi anggaplah saya bisa hidup dengannya.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.