Integracja Tomcat i Eclipse jako środowiska wdrażania na gorąco

88

Chciałbym skonfigurować eclipse i tomcat w sposób zintegrowany, tak aby zmiany na moich stronach JSP i serwletach (jeśli to możliwe) były natychmiast odzwierciedlane, bez konieczności wdrażania.

Ok, to jedno z tych pytań, na które można znaleźć mnóstwo odpowiedzi w całym internecie, ale wszystkie wydają się inne. (użyj wtyczki Sysdeo, użyj wtyczki JBOss, rób rzeczy z przestarzałym Eclipse, użyj zamiast tego MyEclipse itp.) i nie mogłem znaleźć 1 ostatecznego zasobu, do którego mógłbym się odwołać. Więc na moją korzyść, jaka jest najprostsza i najbardziej zalecana procedura, aby to skonfigurować?

Zakłada się, że mam niezależnie działające zaćmienie i kocur. Właściwie udało mi się je zintegrować w sposób niezwiązany z wdrażaniem na gorąco, korzystając z instrukcji tutaj: http://www.ibm.com/developerworks/opensource/library/os-eclipse-tomcat/index.html

Wersja Eclipse Wersja: 3.4.2 (Ganymede) Tomcat v6.0.20

udit
źródło
17
4 lata później zaskakuje mnie fakt, że to wciąż problem. No dalej, to całkiem fundamentalne.
Konrad Garus
Myślę, że 7 lat później (prawie) odkryłem rozwiązanie: stackoverflow.com/a/37064672/1034436
martian111

Odpowiedzi:

75

Istnieją dwie możliwości.

Po pierwsze, Eclipse pozwala to zrobić, z niewielką zmianą konfiguracji (zobacz także ten szczegółowy post )

  • dodaj Tomcat do listy serwerów
  • ustaw projekt jako „Dynamiczny projekt sieciowy” (za pomocą kreatora tworzenia lub sekcji aspektów w ustawieniach)
  • dodaj projekt do tomcat i skonfiguruj jego „zestaw wdrożeniowy”
  • kliknij dwukrotnie tomcat na liście, aby otworzyć konfiguracje
  • Zmień „Publikowanie” na „Nigdy nie publikuj automatycznie” (oznacza to, że serwer nie zostanie ponownie uruchomiony po naciśnięciu ctrl + s)
  • uruchom Tomcat w trybie debugowania

Będzie to nadal odzwierciedlać zmiany w kodzie, ale nie spowoduje ponownego uruchomienia serwera.

Po drugie, przez długi czas korzystałem z wtyczki FileSync :

  • skonfiguruj wtyczkę, aby wysyłała wszystkie klasy z bin Director do WEB-INF/classesinstalacji tomcat (jest to prawie to samo, co konfigurowanie zestawu wdrożeniowego)
  • skonfiguruj wszystkie inne zasoby, aby przejść do odpowiednich lokalizacji
  • opcjonalnie, zdenerwuj wszystkie bezwzględne ścieżki z ustawień lokalizacji filesync do jednej zmiennej i skonfiguruj tę zmienną w eclipse (w ten sposób będziesz mógł również zatwierdzić ustawienia filesync, jeśli wszyscy członkowie używają eclipse)
  • dodaj Tomcat do listy serwerów w eclipse, skonfiguruj opcję „Lokalizacje serwerów” na „Użyj instalacji tomcat” (ekran otwiera się po dwukrotnym kliknięciu tomcat na liście serwerów)
  • uruchom Tomcat w trybie debugowania

U mnie to działa doskonale. Każda zmiana niestrukturalna jest natychmiast odzwierciedlana, bez ponownego wdrażania.

Aktualizacja:
Możesz przeczytać więcej o metodach wdrażania na gorąco tutaj .
Ja też stworzył projekt , który łatwo synchronizuje roboczy z kontenerem serwletów.

Bozho
źródło
@VladimirTsvetkov nie - to dwie różne opcje
Bozho
Próbuję twojego pierwszego podejścia, ale używam Maven Overlays i kiedy zmieniam plik w jednej z nakładek, serwer jest nadal restartowany (nakładka nie jest dynamicznym projektem internetowym, ale dynamicznym modułem internetowym). Jakieś pomysły?
Hoffmann
2
Mam wrażenie, że zmieniając „Publikowanie” na „Nigdy nie publikuj automatycznie”, strony JSP nie są już przeładowywane / rekompilowane po zmianie. Część przeładowywania klas działa jednak dobrze, uruchamiając Tomcat w trybie debugowania.
yglodt
5
Robię to w inny sposób: najpierw zmień na automatyczne publikowanie; po drugie, kliknij Moduleskartę w konfiguracji serwera, a następnie kliknij edit, odznacz auto deploy enabled, myślę, że to najprostszy sposób. PS: Twój pierwszy sposób nie działa dla mnie.
hiway,
@hiway, gdzie jest ta karta Moduły w zakładce konfiguracji serwera?
Mateus Viccari
30

Po prostu pozwól eclipse zapisać pliki klas bezpośrednio do katalogu $ TOMCAT / webapps / MyWebApp / WEB_INF / classes. Następnie skonfiguruj apache-tomcat, aby sprawdził, czy pliki klas zostały zaktualizowane i załaduj je ponownie, jeśli tak.

Aby skonfigurować program Tomcat, aby automatycznie przeładowywał klasę po zmianie, musisz to zrobić

edytuj $TOMCAT/conf/context.xmli ustaw:

<Context reloadable="true"> 

Być może będziesz musiał edytować i ponownie załadować webapps/$YourWebApp/web.xmlplik i dołączyć:

<web-app reloadable="true">

Nie pamiętam, czy obie zmiany są potrzebne, ale tak skonfigurowałem mój tomcat-6.0.18 do automatycznego ponownego ładowania.

Martin Tilsted
źródło
Zgodnie z dokumentacją tomcat.apache.org/tomcat-6.0-doc/config/context.htmlContext odradzają umieszczanie elementów w pliku server.xml, ale powinien monitorować / WEB-INF / classes / i / WEB-INF / lib za wszelkie zmiany. Gdzie przeczytałeś o atrybucie web-appelementu?
Michael
Przepraszamy, trochę źle odczytałem twoją odpowiedź. Plik context.xml „powinien zostać załadowany dla każdej aplikacji internetowej”.
Michael
2
Jak skonfigurować miejsce, w którym Eclipse zapisuje pliki klas?
yglodt
7

Zastrzeżenie : Jestem po prostu szczęśliwym klientem, nie pracuję dla Zero Turnaround i nie jestem z nimi w żaden sposób powiązany.

Sprawdź JRebel - pozwala na kodowanie bez ponownego uruchamiania aplikacji internetowej. Zasadniczo działa poprzez instrumentowanie twoich zajęć i dostosowywanie ich zmian. Obsługuje znacznie więcej przypadków niż wdrożenie na gorąco , w tym:

  • Dodawanie / usuwanie metod
  • Dodawanie / usuwanie konstruktorów
  • Zmiana interfejsów
  • Dodawanie / usuwanie zaimplementowanych interfejsów

Jest komercyjny ( szczegóły cenowe , 550 USD rocznie od czerwca 2018 r.) I ma wiele wtyczek do platform innych firm, w tym:

  • Guice
  • Wiosna
  • Rozpórki 2

Bezpłatną wersję próbną dostajesz dość bezboleśnie - proponuję spróbować.

Robert Munteanu
źródło
2
Jrebel, kiedy to działa, to działa. Kiedy tak się nie dzieje, jest to koszmar. Uderzam w głowę ich wsparciem od ponad tygodnia i nadal nie mogę zmusić go do pracy w mojej prostej wiosennej konfiguracji mvc. Nie pomogą im dalej, jeśli nie wyślę im mojej aplikacji lub helloworld mojej aplikacji. ORAZ twoje ceny są nieaktualne - teraz ładują bombę. Dzięki Bogu, użyłem tylko ich wersji próbnej
happybuddha
Obecna cena to 365 USD / rok / miejsce
Joseph Lust
A teraz to 550 $ / rok / miejsce
frewper
3

Zmień swój obszar roboczy w Eclipse na \ tomcat \ webapps Ponieważ jest to tylko do twojej pracy, powinno to działać dobrze. Wszelkie zmiany wprowadzone w Eclipse znajdują się w tym samym katalogu, w którym Tomcat szuka aplikacji do wdrożenia

PaganSensei
źródło
3

W widoku serwerów utwórz nowy serwer, nie dodawaj jeszcze żadnego zasobu (projektu) do serwera. Kliknij dwukrotnie serwer w lokalizacji serwerów. Wybierz opcję „Użyj instalacji tomcat”. Zmodyfikuj „Ścieżkę wdrażania” do katalogu wdrażania tomcat (np .: c: \ server \ Tomcat 7.0.14 \ webapps). Rozszerz „sekcję wydawniczą”. Zaznacz „Automatycznie publikuj po zdarzeniu kompilacji”. Zapisz i zamknij. Z menu zaćmienia zaznacz „Projekt -> Buduj automatycznie”. W widoku serwerów kliknij prawym przyciskiem myszy na serwerze, „Dodaj i usuń”, opublikuj swój projekt.

ticu0000
źródło
2

Dlaczego nie użyć zintegrowanego serwera Tomcat firmy with in eclipse, jeśli jest to tylko do programowania? Możesz skonfigurować serwery w oknie-> preferencje. Po skonfigurowaniu, jeśli masz plik jsp o nazwie page.jsp, możesz kliknąć go prawym przyciskiem myszy i wybrać Uruchom na serwerze. W preferencjach-> ogólne-> przeglądarka internetowa możesz wybrać pogodę, aby korzystać z przeglądarki wbudowanej lub zewnętrznej. Wprowadź zmiany w pliku jsp, zapisz i odśwież stronę w przeglądarce. Zmiany zostaną automatycznie odzwierciedlone po zapisaniu i odświeżeniu przeglądarki.

Jared
źródło
2

To, co działa dla mnie tutaj, to:

context.xml w ten sposób:

<Context path="/myapp" docBase="myapp" debug="5"
    reloadable="false" antiResourceLocking="false" antiJARLocking="true">
<!-- this because i´m using Spring 3.1 with Tomcat -->
    <Loader     loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader" />

</Context>

Następnie na zakładce Serwery w Eclipse, na zakładce "Moduły", wyłączyłem "Automatyczne przeładowanie" dla wszystkich wdrażanych modułów.

Pozwól także domyślnej konfiguracji na automatyczne publikowanie.

I używa Mavena z WTP, nie zapomnij zostawić zawartości src / main / resources w, ponieważ Eclipse nalega, aby wykluczyć zawartość tego folderu z ostatecznej kompilacji.

Tylko z tym wszystkim otrzymałem pełne klasy (VM), które można wdrożyć na gorąco, z zasobami na gorąco!

chuckedw
źródło
1

W swoim środowisku programistycznym po prostu wskaż serwerowi Tomcat, aby szukał stron JSP w dowolnym katalogu, w którym je opracowujesz. Zmiany będą widoczne natychmiast po zapisaniu pliku.

Cameron
źródło
1

Udało mi się to uruchomić w moim środowisku programistycznym przy użyciu agenta Spring Loaded JVM. Chociaż tworzę aplikacje internetowe Spring, opis tego projektu wspomina, że ​​tak jest

możliwe do wykorzystania w każdym kodzie bajtowym, który może działać na JVM

Korzystając z poniższej konfiguracji, mogłem uzyskać zmiany do automatycznego opublikowania do podłączonej instancji Tomcat (zwykła metoda Eclipse WTP). Używam Spring Tool Suite 3.7.3 opartego na Eclipse Mars.2 (4.5.2).

  1. Pobierz najnowszą wersję JAR Spring Loaded z ich projektu Github . Zostało to przetestowane za pomocą springloaded-1.2.5.RELEASE.jar.
  2. Skonfiguruj serwer Tomcat w Eclipse w normalny sposób (przetestowane z Tomcat 8.0.30)
  3. Otwórz stronę konfiguracji serwera Tomcat w Eclipse (kliknij dwukrotnie instancję serwera w zakładce „Serwery”).
  4. W sekcji „Opcje serwera” usuń zaznaczenie opcji „Domyślne automatyczne ponowne ładowanie modułów”.
    • Uwaga: Jeśli masz już moduły sieciowe dodane do serwera, może być konieczne indywidualne wyłączenie opcji „Automatyczne przeładowanie” w zakładce „Moduły” (u dołu okna strony konfiguracji).
  5. W sekcji „Informacje ogólne” kliknij „Otwórz konfigurację uruchamiania”
    • Na karcie „Argumenty” dodaj na końcu „argumentów maszyny wirtualnej”: -javaagent:/path/to/downloaded/springloaded-1.2.5.RELEASE.jar -noverify
    • Aby umożliwić obserwowanie .classplików JAR oprócz plików projektu , skonfiguruj -Dspringloaded=watchJars=argument VM zgodnie z komentarzami tego problemu .

Uruchom serwer i jak zwykle opublikuj na nim projekty dynamicznych aplikacji internetowych. Ponownie mogłem to przetestować z aplikacjami internetowymi Spring. Na przykład modyfikacja kodu, dodawanie / odejmowanie metod itp. W klasach @Controller zostały zastosowane niemal natychmiast po zapisaniu pliku i kompilacji Eclipse oraz opublikowaniu zmienionej klasy. Na koniec, sekcja FAQ projektu Spring Loaded wspomniała o kilku przypadkach, w których rzeczy nie ładują się ponownie, więc wymagałyby ponownego uruchomienia serwera / aplikacji. Ale te wyjątki są znacznie rzadsze.

Jeszcze jedna uwaga: NIE działa to z wbudowanym serwerem Pivotal tc lub serwerem VMware vFabric tc, które są dostarczane z STS. W przypadku tych serwerów dostępna jest opcja „Włącz ponowne ładowanie oparte na agencie Java (eksperymentalne)”, ale korzysta ona ze starszej wersji 1.2.0 Spring Loaded, która nie działała.

martian111
źródło
Wygląda na to, że musisz zrozumieć Spring, co z Non Springaplikacją.
Tangoo
Chociaż do skonfigurowania pliku JAR SpringLoaded JAR dla serwera Tomcat potrzebujesz, uruchomione aplikacje NIE muszą być aplikacjami Spring (ani zawierać żadnych plików JAR Spring). Przetestowałem to pomyślnie z prostym, pojedynczym serwletem HelloWorld.
martian111
0

Czy jesteś otwarty na używanie Jetty do celów programistycznych?

Jeśli tak, to jest całkiem proste w użyciu z Maven - po prostu uruchom mvn jetty:run

matowe b
źródło
0

To może nie jest najlepszy sposób, ale dla mnie działa.

  • $ tomcat / conf / Catalina / localhost / .xml
  • $ contextPath / webapp / web / WEB-INF / lib / *. jar
  • $ contextPath / webapp / web /
  • $ eclispeWorkbench / project-servlet / src /
  • $ eclispeWorkbench / project-servlet / servlet.jardesc (powinien eksportować plik jar do katalogu lib w $ contextPath)
  • $ eclipseWorkbench / project-jsp /

Używam polecenia rsync, aby zsynchronizować zmiany z mojego projektu jsp do $ contextPath.

Użyj zdalnego debugowania w Eclipse for Tomcat, co pozwoli na ograniczoną wymianę kodu na gorąco. Jeśli zmienisz pola statyczne lub dodasz metody, będziesz musiał wyeksportować jar i ponownie uruchomić kontekst.

TJR
źródło
0

czy możemy skorzystać z poniższej opcji? Kliknij dwukrotnie Serwer w zaćmieniu -> Lokalizacje serwerów -> Użyj instalacji tomcat. Przejmuje kontrolę nad instalacją tomcat. Nie musisz ponownie uruchamiać serwera w celu zmiany klas java.

Tushar Sagar
źródło
0

Znalazłem najprostszy sposób: użycie dowiązań symbolicznych: myślę, że jest to najszybszy sposób, ponieważ w ogóle nie ma synchronizacji: katalog tomcat i katalog twojego projektu będą przez cały czas w tym samym katalogu.

Tomcat będzie okresowo wykrywać zmiany i ponownie wdrażać aplikację.

Istnieje również sposób na debugowanie aplikacji, więc uważam, że jest to dobre rozwiązanie.

Udokumentowałem tutaj moje rozwiązanie dla wszystkich zainteresowanych.

Raul Luna
źródło
czy mogę wiedzieć, dlaczego istnieje potrzeba korzystania ze zdalnej aplikacji Java, ponieważ używa ona hosta lokalnego, co oznacza, że ​​debuguję przy użyciu własnego komputera lokalnego
Karen Goh
0

Na wypadek, gdybyś się spieszył:

  1. zaznacz „nigdy nie publikuj automatycznie” w tomcat (innym kontenerze) w eclipse.
  2. uruchom tomcat (inny kontener) w trybie debugowania.

voila! :)

Sachin Verma
źródło
0

W Eclipse kliknij projekt w górnym menu i upewnij się, że wybrana jest opcja „Buduj automatycznie”. To rozwiązało mój problem. Używałem Eclipse z Tomcat przy użyciu metadanych mojego obszaru roboczego. Prowadziłem również Mavena w projekcie Dynamic Web Module. Aby zweryfikować, dodaj swoją aplikację do Tomcat. Uruchom Tomcat z poziomu Eclipse. Upewnij się, że aplikacja jest wdrożona i działa. Otwórz kartę Console w Eclipse. Wprowadź zmianę w swojej aplikacji. Po kilku sekundach powinieneś zobaczyć, jak Twoja zmiana zostanie automatycznie utworzona i wdrożona w Tomcat.

NLessani
źródło
-2

Najprostszy, najszybszy: ustaw Eclipse tak, aby generował plik WAR podczas budowania; jako krok po kompilacji skopiuj ten plik WAR do katalogu webapps tomcat. Tomcat rozpozna zmianę i odświeży witrynę bez konieczności wdrażania. Zauważ, że to nie jest idealne; użytkownicy korzystający z tej aplikacji internetowej mogą mieć mniej niż optymalne wrażenia, ponieważ Tomcat ponownie uruchamia aplikację internetową „pod” nimi; ale to pasuje do twojej prośby.

Paul Sonier
źródło
1
ok ... chyba nie wyjaśniłem moich zamiarów. Naprawdę nie jestem zainteresowany wdrażaniem aplikacji dla niektórych użytkowników, ale próbuję uruchomić tomcat z eclipse do moich codziennych potrzeb programistycznych i skrócić cykl informacji zwrotnych (wprowadź zmianę) -> (Zobacz wynik) zamiast (Make Zmień) -> Wdróż -> (Zobacz wynik)
udit