Intellij IDEA Java sınıfları kayıt sırasında otomatik olarak derlenmiyor


182

Dün Eclipse'den IntelliJ IDEA'ya geçtim.

JRebel'i WebSphere Server 7 ile de kullanıyorum.

Şimdi herşey olması dışında biraz ince çalışıyor görünüyor ben değiştirdiğinizde bir Java dosyası ve isabet kaydetmek , Intellij gelmez JRebel onu almak için sırayla, dosyasını yeniden derlemek.

Eclipse " Otomatik Olarak Oluştur " özelliği bu sorunu çözdü.

IntelliJ IDEA'da, JRebel'in alması için ilgili sınıfı yeniden derlemek için CTRL+ SHIFT+ 9tuşuna basmam gerekiyor. Değişiklikler karşısında bittiyse iki dosyanın , ben her bunu yapmak ve biri onları ve IntelliJ tüm mekanizma tasarrufu kullandığından, onun oldukça sert Gerçekten birini yaparak ilgilenen değilim hangi elle yeniden derlemek için bilmek.

IntelliJ'in bunu kendi başına yapmasının bir yolu yok mu?


11
Neden sadece Ctrl+ 'ya basmıyorsun F9? Bu, tüm projeyi inşa edecek ve sadece iki dosya değiştiyse, bunlar yeniden oluşturulacaktır.
maba

2
Her şeyi yeniden inşa etmekten korkuyordum. Ben varsayılan yeniden inşasında net çıktı olduğuna inanıyorum ... yani normalde bu iyi çalışmıyor ...
mmm

5
O mu değil yapı önce temizleyin. Artımlı bir yapı. İsterseniz yeniden inşa etmek için başka bir seçeneğiniz var.
maba

Yanıtlar:


251

GÜNCELLENMİŞ

IntelliJ IDEA 12+ sürümleri için, harici derleyici seçeneğini kullanıyorsanız, düzenlenmiş kaynakları otomatik olarak oluşturabiliriz. Gereken tek şey , " Derleyici " ayarları altında bulunan " Projeyi otomatik olarak oluştur " seçeneğini işaretlemektir:

Derleyici Ayarları

Ayrıca, uygulama çalışırken veya yay önyükleme devtools kullanıyorsanız, sıcak dağıtmak istiyorsanız compiler.automake.allow.when.app.running, kayıt defterinden de etkinleştirmeniz gerekir . Bu, değişikliklerinizi otomatik olarak derleyecektir.

Kullanımı Ctrl+ Shift+ A(veya + Shift+ AMac'te) türü Registrykayıt pencereleri açık kez bulmak ve etkinleştirmek compiler.automake.allow.when.app.running, buraya bakın:

resim açıklamasını buraya girin


12 yaşından büyük sürümler için, IDEA'nın kaydedilen dosyaları otomatik olarak derlemesini sağlamak için EclipseMode eklentisini kullanabilirsiniz .

Daha fazla ipucu için "Tutulmadan IntelliJ IDEA'ya Geçiş" kılavuzuna bakın.


10
Bunun için bir eklenti yüklemem gerektiğine can sıkıcı geliyor. Dün ve bugün bunu zaten geçirdim. Keşke sadece bunun için bir seçenek oluşturabilirler, Eclipse'nin bu özellik üzerinde bir patenti olduğunu düşünmüyorum, değil mi? Ayrıca otomatik olarak kaydederken CTRL + S ile yeniden eşleme yapabilirim. Birkaç seçeneği deneyeceğim. teşekkürler
mmm

14
Bu yavaş. Bu çok yavaş. İyileştirmek için çok yer var! Ben arka planda yaptığı şey değilim, ama tek bir sınıfta küçük bir değişiklik derlemek için Intellij yaklaşık 3-4 saniye sürer. Bir sınıf anlamına gelen "Derle 'StartController.java'" bile sadece 3-4 saniye sürer. Eclipse bunu 100 milisaniyeden daha kısa sürede yapar. Tutulma modu eklentisini tekrar test edip neyle gideceğime karar vereceğim ..
MMM

34
"projeyi otomatik yap" yalnızca çalışmaz / hata ayıklama yapmadığında çalışır
xenoterracide

8
Intellij 2017.1.3 ve spring boot devtools ile benim için çalışmıyor.
Nico de Wet

1
IntelliJ IDEA 2017.3.3, Java 9.0.4, Spring Boot 2.0.0.RC1, Spring devtools ile çalışmayın :(
Nhu Vy

75

Lütfen her iki adımı da izleyin:

1 - Derleyiciden Automake'yi etkinleştir

  • Basın: ctrl+ shift+ A(Mac + shift+ için A)
  • Tür: make project automatically
  • Hit: Enter
  • Enable Make Project automaticallyözelliğini

2 - Uygulama çalışırken Otomatik Yapmayı etkinleştir

  • Basın: ctrl+ shift+ A(Mac + shift+ için A)
  • Tür: Registry
  • Anahtarı bulun compiler.automake.allow.when.app.runningve etkinleştirin veya yanındaki onay kutusunu tıklayın

Not: Uygulamanızı şimdi yeniden başlatın :)

Not: Bu ayrıca yay önyükleme aygıtlarıyla canlı yeniden yüklemeye izin vermelidir.


2
Mükemmel, bu sadece aradığım
şeydi

3
Bu aynı zamanda benim için bahar-bot-devtools ve IntelliJ IDEA 2016.2.5 ile çalıştı
Xaero Degreaz

2
Doğru, bu IntelliJ 2017.1.3 üzerinde çalışıyor gibi görünüyor, bahar önyükleme devtools ile ihtiyaç duyduğu şey bu seçenek 2 kullandım.
Nico de Wet

1
İyi çalıştı ama JRebel'e yeniden yüklemek 4-5 saniye sürüyor. Bunun herhangi bir yolu var mı?
user3184974

1
Yukarıdaki 1 ve 2 maddelerinin "seçenekler" olduğunu düşünmüyorum, ancak adımlar. Her ikisini de yapmanız gerekiyor.
Thomas Carlisle

67

UYARI

Eclipse Mode eklentisi kullanılmıyor ve son IDEA 12+ sürümleriyle uyumlu değil. Eğer yüklerseniz, IDE her dosya değişikliğine asılır ve son derece yavaş yanıt verir.


IntelliJ IDEA otomatik derleme kullanmaz, derleyici aracılığıyla değil hataları anında algılar. Eclipse moduna benzer olarak IDEA 12'de mevcut olacak :

Projeyi otomatik yap

Kullanım Build|Make, yalnızca değiştirilmiş ve bağımlı dosyaları derleyecek artımlı oluşturma işlemini başlatır (çok hızlıdır).

Ayrıca yardımcı olabilecek bir SSS girişi de vardır .

Otomatik marka oluşturma özelliğinde güncelleme : Çalıştır / hata ayıklama yapılandırması çalışırken, Make project automaticallyhiçbir etkisi yoktur. Diskteki sınıflar yalnızca Build| Make. Bizim görüşümüze göre, diskteki sınıf değişiklikleri her zaman kullanıcının kontrolü altında olmalıdır. Otomatik yapma, Eclipse özelliğinin taklitçisi değildir, farklı çalışır ve asıl amacı, sınıfların gerçekten ihtiyaç duyulduğunda hazır olmasını beklemek için zamandan tasarruf etmektir (uygulamayı veya testleri çalıştırmadan önce). Otomatik oluşturma, bu soruda açıklanan durumda olduğu gibi tetiklemeniz gereken açık derlemenin yerini almaz. Farklı bir davranış arıyorsanız, yukarıdaki SSS'ye bağlı EclipseMode eklentisi daha iyi bir seçim olacaktır.


Evet, daha önce görmüştüm, ama pop-up ve hepsi ile çok yavaş olduğunu reddetti. Başka bir şey için olduğunu düşündüm. Ben bir CTRL + 9 can sıkıcı bir althoguh denemek olabilir, ama sanırım otomatik olarak kaydeder yapmak için CTRL + S için remap olabilir.
mmm

Güncelleme için teşekkürler. Eclipse Mode eklentisini yükledim. O diyaloga sahip olma ... Ah .. Intellij 12 ... iyi, geliştirdiğin iyi. İntellij 12 dışarıda mı?
mmm

3
Birkaç gündür 12 deniyorum. Harici derleme -> make kullan otomatik olarak herhangi bir işlem yapmaz. Hiçbir şey olmaz. Tutulma modu eklentisini kullandığımda (ayarlardan etkinleştir / devre dışı bırak) iyi çalışıyor, ancak tutulma modu eklentisini devre dışı bırakıp "dış yapıyı kullan -> otomatik yap" seçeneğini etkinleştirdiğimde, düzenleme ve kaydetme konusunda hiçbir şey olmuyor ... neden?
mmm

2
@CrazyCoder Ben sadece bu ve jRebel geri geldi. Bu çok yavaş. İyileştirmek için çok yer var! Ben arka planda yaptığı şey değilim, ama tek bir sınıfta küçük bir değişiklik derlemek için Intellij yaklaşık 3-4 saniye sürer. Bir sınıf anlamına gelen "Derle 'StartController.java'" bile sadece 3-4 saniye sürer. Eclipse bunu 100 milisaniyeden daha kısa sürede yapar. Eklentiyi tekrar test edip neyle gideceğime karar vereceğim ..
mmm

1
@SecretService sekmesi davranış önerileri youtrack.jetbrains.com/issues/IDEA adresinde bulunabilir . Sabitlenmiş sekmelerle ve kapanmalarını engelleyen birkaç açık sorun var.
CrazyCoder

38

ctrl+sBir adımda kaydetmek VE derlemek için tuş eşlemesini kullanabilirsiniz. Tuş haritası ayarlarına gidin ve arayın Compile.


3
Teşekkürler, en çok hoşuma gitti! Intellij'deki otomatik derleme ve bu da, ama en azından şimdi bittiğinde görüyorum, çok yavaş.
mmm

Benim için çalışmadı, derlemek için CTRL + S atamak hata ayıklama düğmesiyle sunucumu yeniden başlatmadı
Dimitri Kopriwa

Benim için çalışıyor, Intellij 2018.2. Yapı Projesi
Neo Pham

18

Her ikisi de 1 tıklama gerektirdiğinden aslında hiçbir fark yoktur :

  • Eclipse : manuel Kaydet, otomatik derleme.
  • IntelliJ : otomatik Kaydet, manuel derleme.

En basit çözüm sadece buna alışmaktır . Çünkü gündüzünüzün çoğunu IDE'nizde geçirdiğinizde, birçoğunda hızlı alışkanlıklara sahip olmak, birkaçında yavaş alışkanlıklardan daha iyidir.


2
IntelliJ deneyimini geliştirmenin bir yolu var: tarayıcıya geçerken kaydedin ve derleyin
ruX

Eclipse kaydetme eylemleri ekleme yeteneğine sahiptir, böylece kaydetme sırasında içe aktarma düzenleme ve kod biçimlendirme gibi şeyler de yapabilirsiniz. Tüm bunları manuel olarak yapmak önemli sayıda tuş vuruşu ekler ve işlemi daha fazla hataya eğilimli hale getirir. Örneğin, Eclipse uygulamasına kaydettiğinizde biçimlendirirseniz hiçbir zaman biçimlendirilmemiş kodunuz olamaz. IntelliJ'de biçimlendirmeyi unutmak çok kolay.
Max

1
@Max, IntelliJ bu eylemleri taahhüt sırasında yürütür (ki bu benim kişisel zevkime göre en iyi an). Bazı durumlarda, doğrudan editörde kodlama stili sorunlarını da vurgular (örn. Python için PEP8 uyumluluğu).
andruso

2
Bir IDE'nin benim için yaptığı ve diğerinin yapmadığı, hayatımı zorlaştıran bir şeye alışmak iyi bir satış noktası değildir.
Jonathan

1
@Jonathan kullanılabilirliği geliştirmek için kullanıcılar için eski, çoğu zaman gereksiz alışkanlıkları bırakmayı gerektirir.
andruso

17

Kaydetmek ve bir adımda derlemek için bir Makro kaydettik ve tuş eşlemesini tamamladım Ctrl+s.


5
@SecretService Aynı kısayolla birden çok eylem eşlendiğinde eylem sırası tanımlanmadığından herkes için çalışmayabilir.
Celos

13

Bunu makroları kullanarak çözmeyi başardım.

Bir makro kaydetmeye başladım:

  • Düzenle - Makrolar - Makro kaydını başlat'ı tıklayın
  • Dosya - Tümünü Kaydet'i tıklayın
  • Oluştur - Proje Yap'ı tıklayın
  • Düzenle - Makrolar - Makro kaydını durdur'u tıklayın

"SaveAndMake" gibi yararlı bir ad verin.

Şimdi tüm tuş bağlamalarını kaydet ve aynı tuş bağlamayı makronuza ekle!

Şimdi, her kaydettiğimde, kaydediyor ve kirli bir derleme yapıyor ve jRebel artık tüm değişiklikleri doğru bir şekilde tespit ediyor.


Mevcut kaydetmek yerine makro farklı bir tuş bağlama veren öneririz - ama bu sadece aynı derecede öznel.
arcseldon

Teşekkürler. Normal bir "Derleme" (diğer cevapların önerdiği gibi) benim için bile yeterli olmadığından bu çözümü her seferinde kaydetmek + yeniden oluşturmak için kullanıyorum. Çok fazla kaynak tüketse bile Eclipse hissini geri veriyor ...
Boris

5

Etkinleştirmek için lütfen bu adımları dikkatle izleyin.

1) SB V1.3 ile Spring Boot projesi oluşturun ve bağımlılıklara "Devtools" (1 *) ekleyin

2) Yardım-> Eylem Bul ... öğesini çağırın ve "automake" iletişim kutusunda "Kayıt Defteri" yazın ve " compiler.automake.allow.when.app.running " girişini etkinleştirin, iletişim kutusunu kapatın

3) Ayarlar-> Derleme, Yürütme, Dağıtım-> Derleyici "Projeyi otomatik yap" bölümünde arka plan derlemesini etkinleştirin

4) Bahar Önyükleme çalıştırma yapılandırmasını açın, her şey doğru yapılandırılırsa uyarı mesajı almalısınız

5) Uygulamanızı çalıştırın, sınıflarınızı anında değiştirin

Lütfen deneyimlerinizi ve sorunlarınızı bu konuya yorum olarak bildirin.

daha fazla bilgi için buraya tıklayın


Hala "Devam Ediyor" olarak işaretlenmiş ve benim için çalışmıyor.
JGarrido

2

Bundan etkilenen maven projemde benim için çalışan tek şey, birim testlerimin çalışma yapılandırmasına bir "test derleme" hedefi eklemektir. İnanılmaz derecede beceriksiz bir çözüm, ama işe yarıyor.

resim açıklamasını buraya girin


en azından işe yarıyor: D ama evet, bu sorunun kaynağını bulmak daha iyi
anindis

2

Intellij, diğer modülde derleme sorunuyla karşılaştığında sessizce başarısız olur ve daha sonra otomatik derleme gerçekleştirilmez. ProblemsPencereni kontrol et


1

Aynı sorunu yaşadım. "Güç tasarruf modunu" kullanıyordum, bu artımlı olarak derlenmeyi ve derleme hataları göstermeyi engelliyor.


Idont, bu cevabın neden indirildiğini biliyor, aynı zamanda soruyu da cevaplıyor, benim için aynıydı - "Güç tasarrufu modu", ayarlarda yazılmasına rağmen, ancak bu etkin otomatik derleme çalışmıyor.
Nerius Jok

1

Reformat ve Derleme eklentisini kullanın (Alexandre DuBreuil'in Kaydetme Eylemleri eklentisinden esinlenilmiştir):

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

Şu anda sadece bir kavanoz dosyası sunuyorum, ancak bu kodun en önemli kısmı:

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
Neden birisi rastgele bir kod indirip çalıştırsın ki?
Drew

@ Çekti: İncelemek için Jetbrains'e yükledim. Ama paranoyak iseniz sanırım oradan önce birkaç gün bekleyebilirsin ...
sbmpost

sbmpost, ben sadece neden bazı (ben yapmadım değil) aşağı oy, Bir Yanıt değil olarak işaret ve bu silinmiş işaret ediyorum.
Drew

Eğer kod ise, metin olarak gönderebilirsiniz, bu harika. Yapabilir misin? Bu bir kod sitesidir.
Drew

1
@drew: kavanoz hakkında not ekledi ve koda biraz daha bağlam ekledi. Yüksek düzeyde görünebilir, ancak FileDocumentManagerAdapter'ten genişleyip kodu eklerseniz, (neredeyse) derleyici bir ReformatAndCompile sınıfına sahip olursunuz.
sbmpost

1

Çalıştırma / Hata Ayıklama Yapılandırmanızı, başlatmadan önce Oluştur seçeneği seçilecek şekilde düzenleyin

resim açıklamasını buraya girin

Derleme seçeneği seçildikten sonra

resim açıklamasını buraya girin

Yukarıdaki çözüm JBehave test takımımda çalışırken benim için çalıştı


Bu güzel, ama soru bir test, vb gibi bir şey yapmadan önce tekrar özel bir komut kullanarak
açıklık

1

Proje yapımda gereksiz bir modül olması benim için işe yaramıyordu. Testler sanırım diğer modül kullanılarak yapıldı.

Nasıl böyle bittiğini bilmiyorum ama kaldırmak sorunu çözdü.

Çalıştır / Hata Ayıkla ayarlarınızın otomatik kaydetme ile oluşturduğunuz modülü kullandığından emin olun.

Örn: içindeki modüle bakın

resim açıklamasını buraya girin

Modülleri Proje Yapısı - Modüller içinde değiştirebilirsiniz

resim açıklamasını buraya girin


1

Aynı sorunu yaşadım. Sınıfınızın derlenip derlenemeyeceğini kontrol etmenin uygun olacağını düşünüyorum. Yeniden derle'yi tıklayın (varsayılan olarak Ctrl + Üst Karakter + F9). Eğer çalışmıyorsa, neden derlenmediğini araştırmanız gerekir.

Benim durumumda kod otomatik derleme değildi çünkü derleme ile gizli hatalar vardı (onlar hiçbir yerde günlüklerde gösterilmedi ve maven clean-install çalışıyordu). Kök neden yanlış Proje Yapısı -> Modül yapılandırması olduğundan Intellij Idea bu yapılandırmaya göre yapılandıramadı.


1

bu yüzden, aynı sorunu ve ayrıca intellij bir sorun dosya simgesini vardı ı kaldırıldı.idea klasör ve yeniden ithalat projesi sorunumu çözdü.


0

Hata alıyordum: bazı kavanozlar sınıf yolunda değil.Bu yüzden sadece bozuk kavanoz silmek ve aşağıdaki adımların perrform

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

Mevcut bir yanıta yorum yapmak için yeterli puan yok, ancak yukarıdaki bazı kişilere benzer şekilde, sadece İthalatları Düzenle / Biçim / Kaydet / Kaydet / Hızlı Yeniden Yükle (F9) / Senkronize Et için bir makro ve anahtar haritası ekledim .

Senkronizasyon, harici oluşturma araçları / gözlemcileri (yani webpack) tarafından değiştirilen kaynaklardaki güncellemeleri görebilmemin tek yolu olarak göründüğü için eklenir.

İşlem tutulmadan daha yavaştır - ve harici dosya yenilemesi genellikle komutu birden çok kez çalıştırmak zorundadır - ancak varsayalım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.