IntelliJ i Tomcat… zmienione pliki nie są automatycznie rozpoznawane przez Tomcat


135

Używam Intellij Ultimate z Tomcat i wdrażam wojnę. Wszystko jest poprawnie wdrażane w katalogu aplikacji webowych tomcat.

Kiedy zmieniam plik, taki jak plik xhtml, czy istnieje sposób, aby tomcat automatycznie odebrał tę zmianę? W tej chwili muszę skopiować plik z Intellij i skopiować go do katalogu, w którym znajduje się on w katalogu aplikacji internetowej tomcat. Wiem, że istnieją pewne pliki, które będą wymagać ponownej kompilacji, ale xhtml nie jest jednym z nich.

Odpowiedzi:


21

Opiszę sekwencję działań za pomocą zrzutów ekranu:

  1. Otwórz konfigurację Tomcat Run / Debug (Uruchom> Edytuj konfiguracje)

wprowadź opis obrazu tutaj

  1. Kliknij ikonę dodawania, wybierz „artefakt”, a następnie wybierz pizza_mvc:war exploded: wprowadź opis obrazu tutaj

  2. Zmodyfikuj „Po aktualizacji działania” i „Przy diaktywacji przy ramce”: wprowadź opis obrazu tutaj

  3. Za każdym razem, gdy chcesz odświeżyć swoje zasoby, naciśnij <Ctrl> + F10


Dziękuję za przypomnienie mi o sprawdzeniu "On 'Update' action"
km1

290

Nie można tego zrobić, jeśli wdrożysz wojnę z IntelliJ IDEA. Może się to jednak zdarzyć, jeśli wdrożysz wybuch wojny . W IDEA:

  1. otwórz konfigurację Tomcat Run / Debug ( Uruchom> Edytuj konfiguracje )
  2. Przejdź do zakładki „Wdrożenie”
  3. W sekcji „Wdrażanie podczas uruchamiania serwera” usuń artefakt (jeśli jest obecny) my-webapp-name:war
  4. Kliknij ikonę dodawania, wybierz „artefakt”, a następnie wybierz my-webapp-name:war exploded
  5. Kliknij przycisk OK (w oknie dialogowym „Wybierz artefakty do rozmieszczenia”)
  6. Wciąż w oknie Run / Debug Configuration, wybierz zakładkę „Server”
  7. Na środku tej karty zmień ustawienie „Przy dezaktywacji ramki” na „Aktualizuj zasoby” lub „Aktualizuj klasy i zasoby”
    • Aktualizuj zasoby: wszystkie zmienione zasoby (to znaczy wszystkie składniki aplikacji inne niż klasy) zostaną zaktualizowane.
    • Zaktualizuj klasy i zasoby: wszystkie zmienione zasoby zostaną zaktualizowane; zmienione klasy zostaną ponownie skompilowane. Zauważ, że to, czy aktualne klasy zostaną zaktualizowane, zależy od możliwości serwera WWW. Jeśli dobrze pamiętam, Tomcat przeładuje pliki html / xhtml i jsp, ale nie serwlety lub klasy używane przez strony JSP lub serwlety. Musisz zmodyfikować Tomcat, aby używał do tego dynamicznego modułu ładującego.
  8. Możesz również ustawić akcję „ Włącz 'aktualizację' ” na wybraną powyżej.
    • To określiło, co się stanie po naciśnięciu Ikona aktualizacjiikony Aktualizuj (lub Ctrl+ F10) w oknie Uruchom.
    • „Pokaż okno dialogowe” określa, czy IDEA wyświetli monit za każdym razem, gdy klikniesz ikonę aktualizacji
  9. Kliknij OK.

Teraz za każdym razem, gdy wprowadzisz zmianę, IDEA ponownie wdroży zmieniony plik (i), gdy ramka IDEA jest dezaktywowana (tj. Traci fokus). Zajmie to sekundę lub dwie, zobaczysz to na dolnym pasku stanu w IDEA. Oczywiście. nadal będziesz musiał odświeżyć przeglądarkę internetową, aby pobierała nowy plik (chyba że strona ma automatyczne odświeżanie Ajax, takie jak fetch).

Dobrym połączeniem z Tomcat jest ustawienie „Dezaktywacja przy ramce” na „Aktualizuj zasoby”, a czynność „Włącz aktualizację” na „Przełóż” lub „Uruchom ponownie serwer”. Umożliwia to szybką aktualizację stron statycznych poprzez dezaktywację ramki oraz klasa zaktualizowana za pomocą akcji „update”.

Firma o nazwie ZeroTurnaround sprzedaje JRebel, który jest dynamicznym rozwiązaniem do ładowania klas . Mają też pięcioczęściową serię na ten temat, która jest bardzo dobra.


Mam błąd: Error: Artifact 'my-webapp-name:war exploded' has invalid extensionjak to naprawić?
Anton Dozortsev

3
Bardzo polecam również używanie DCEVM do automatycznego przeładowywania klas. Następnie możesz użyć opcji „Aktualizuj klasy i zasoby”, aby zastosować wszelkie zmiany w kodzie źródłowym bez ponownego wdrażania aplikacji. Zobacz: blog.jetbrains.com/idea/2013/07/… . Oprócz tego, co wyjaśnia ten samouczek, wymagane jest ustawienie JAVA_HOME na karcie Setup / Connection - Debug w Tomcat Run Configuration, tak aby wskazywało na środowisko JRE DCEVM.
Alex Fedulov,

1
@yaroslavprokipchyn - nie znam JBoss i żadnych „specjalnych” wymagań, które może mieć. Ale o ile wiem, powinno działać tak samo. W przypadku tomcat IDEA tworzy konfigurację Tomcat (context.xml), która mówi Tomcatowi, aby używał katalogu docelowego / {nazwa_kontekstu} jako katalogu głównego aplikacji internetowej. Możesz zajrzeć do przewodnika pomocy, aby uzyskać szczegółowe informacje dotyczące JBO.
Javaru

3
W kroku 7 nie uzyskasz (przynajmniej w Intellij 14) odpowiednich opcji z listy rozwijanej, chyba że wszystkie artefakty zostaną załadowane jako „eksplodowane”.
mortensi

1
@ChiefTwoPencils - Krok 5 to kliknięcie OK w oknie dialogowym „Select Artefacts to Deploy” (dla którego nie ma opcji „Apply”), a nie w oknie konfiguracji Uruchom / Debuguj. Dodałem wyjaśnienie do kroku 5.
Javaru,

12

Jeśli chcesz zaktualizować klasy i zasoby, uruchom Tomcat w trybie debugowania . W tym trybie IntelliJ aktualizuje klasy i zasoby bez problemu (hot swap).

Mam ten sam problem. IntelliJ nie zaktualizował mojego projektu, ponieważ działam w trybie „Run”. Kiedy uruchamiam w trybie debugowania i naciskam Ctrl+ F10, aktualizuje klasy i zasoby.


Control-F10 naprawił problem za mnie. Dziękuję Ci!
Jeffrey Getzin

3

Znalazłem lepszy sposób.

W Eclipse automatycznie budujemy, kompilujemy + przeładowujemy pliki statyczne. W rzeczywistości pliki statyczne są obsługiwane bezpośrednio z src / main / webapp .

W IntelliJ zamiast obsługiwać bezpośrednio z src / main / webapp , w miejscu docelowym utworzony jest folder, w którym będziesz mieć kopię swojego src / main / webapp, a także inne związane z kontekstem .. web-inf / classes / lib.

Jeśli zamiast celu umieścisz wyjście rozstrzelonego artefaktu do src / main / webapp , nie nadpisze on plików źródłowych i będzie służyć bezpośrednio, nie będziesz musiał uderzać - aktualizuj zasoby / aktualizuj zasoby i klasy

Więc to, co musisz zrobić w IntelliJ, to

  1. zmień katalog wyjściowy rozstrzelonego artefaktu na src / main / webapp wprowadź opis obrazu tutaj
  2. zrobić makro do zapisywania i ponownej kompilacji / kompilacji brudnych klas (cmd + shift + f9) wprowadź opis obrazu tutaj wprowadź opis obrazu tutaj
  3. edytuj rejestr i preferencje, aby budować automatycznie i budować podczas działania aplikacji (cmd + shift + a - register). wprowadź opis obrazu tutaj wprowadź opis obrazu tutaj

Po tym, jeśli masz zadania, które zmieniają pliki statyczne spoza IntelliJ, zobaczysz zmiany natychmiast bez przechodzenia do IntelliJ i Update Resources , a dla klas masz to makro, które zapisuje i kompiluje (Uwaga: możesz także po prostu nacisnąć Kompiluj / Recompile: cmd + shift + F9 / cmd + F9 - jeśli masz wielu otwartych edytorów, zobaczysz, że Twoje brudne * edytory nie będą brudne, a zmiany (klasy) zostaną ponownie załadowane)


Wygląda na to, że jeśli masz włączony kompilator rejestru.automake ..., zmiany są przesyłane tylko przez naciśnięcie przycisku Zapisz.
Radu Toader

0

Jest to możliwe tylko po wdrożeniu eksplodowanego folderu wojny, włączeniu ponownego ładowania na gorąco i uruchomieniu programu Tomcat w trybie debugowania.

Oto kroki prowadzące do tego.

  1. otwórz konfigurację Tomcat Run / Debug (Uruchom> Edytuj konfiguracje)
  2. Przejdź do zakładki „Wdrażanie” 3. W sekcji „Wdrażanie przy starcie serwera” usuń (jeśli jest obecny) artefakt nazwa-mojej-aplikacji-war:
  3. Kliknij ikonę dodawania, wybierz „artefakt”, a następnie wybierz my-webapp-name: wojna wybuchła
  4. Kliknij przycisk OK (w oknie dialogowym „Wybierz artefakty do rozmieszczenia”)
  5. Wciąż w oknie Run / Debug Configuration, wybierz zakładkę „Server”
  6. Zmień ustawienia „Dezaktywacja przy ramce” i „Akcja aktualizacji” na „Aktualizuj klasy i zasoby”
  7. Zastosuj i zapisz
  8. Przejdź do normalnych ustawień projektu, klikając Plik, a następnie Ustawienia LUB Naciskając CTRL + ALT + S
  9. goto „Build, Execution, Deployment”
  10. Kompilator
  11. Wybierz opcję Buduj projekt automatycznie
  12. zapisać
  13. Uruchom Tomcat w trybie debugowania

0

jeśli masz pliki wieloczęściowe, które chcesz od razu przeglądać / odtwarzać, prześlij je bezpośrednio do folderu docelowego. * (zmień tylko lokalizację zapisu na folder docelowy / statyczny /)

String yourpath = C\\andSoForth
    yourPath + "\\target\\classes\\static\\uploads\\audiofiles\\"

będziesz mógł natychmiast wyświetlić plik bez konieczności ponownego uruchamiania IDE

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.