Aby nasza aplikacja internetowa napisana w języku Java i skompilowana do pliku WAR mogła być uruchomiona potrzebujemy tkz. serwera aplikacji. Przykładami serwerów aplikacji dla programów javowych są Tomcat, WildFly, JBoss.
Apache Tomcat – serwer aplikacji webowych rozwijany w ramach projektu Apache.
Jako kontener aplikacji jest serwerem, który umożliwia uruchamianie aplikacji internetowych w technologiach Java Servlets i Java Server Pages (JSP). Jest to jeden z bardziej popularnych kontenerów aplikacji internetowych. Tomcat jest wykorzystywany w takich serwerach aplikacji JEE (J2EE) jak Apache Geronimo. Jest również bardzo popularnym kontenerem dla samodzielnych aplikacji pisanych w środowisku Spring Framework.
Dokumentacja Tomcata: https://tomcat.apache.org/tomcat-9.0-doc/introduction.html
Pojęcia:
Document root - główny katalog aplikacji webowej gdzie znajdują się jej zasoby
Context path - relatywna ścieżka do zasobów serwera.
Na przykład, jeżeli umieścimy aplikację webową w katalogu \webapps\myapp , to będziemy mogli się do niej dostać poprzez link URL http://localhost/myapp, a jej context path będzie równy /myapp.
WAR - to rozszerzenie pliku pakietu zawierającego aplikację webową w formacie ZIP (skrót od Web Archive). Zazwyczaj aplikacje Javowe są pakowane jako WAR przez deploymentem. Zwykle plik ten tworzony jest przez środowisko programistyczne.
Po wgraniu pliku WAR, Tomcat rozpakowuje go i zapisuje jego pliku w nowym podkatalogu w katalogu webapps.
Zadanie 1 - ściągnij Tomcata
Ściągnij binarną dystrybucję Tomcata w wersji 9.0.56 odpowiednią dla używanego systemu ze strony https://tomcat.apache.org/download-80.cgi
Rozpakuj ściągniętą paczkę w dowolne miejsce.
Po rozpakowaniu otrzymasz folder apache-tomcat-9.0.56.
Zadanie 2 - uruchom serwer
Uruchom serwer Tomcat korzystając ze skryptu /bin/startup.[sh|bat]
Powinieneś zobaczyć coś takiego:
Using CATALINA_BASE: /home/marcin/Downloads/apache-tomcat-9.0.56
Using CATALINA_HOME: /home/marcin/Downloads/apache-tomcat-9.0.56
Using CATALINA_TMPDIR: /home/marcin/Downloads/apache-tomcat-9.0.56/temp
Using JRE_HOME: /usr
Using CLASSPATH: /home/marcin/Downloads/apache-tomcat-9.0.56/bin/bootstrap.jar:/home/marcin/Downloads/apache-tomcat-9.0.56/bin/ tomcat-juli.jar
Zadanie 3 - przetestuj
W katalogu /webapps/sample/ znajduje się przykładowa aplikacja.
Sprawdź, czy aplikacja działa. Powinna być dostępna pod adresem: http://localhost:8080/examples/
Sprawdź, czy działają zarówno przykłady JSP jak i Servlet._
Jeśli "JSP page" nie działa, to najprawdopodobniej musisz ustawić zmienną systemową JAVA_HOME na ścieżkę do JDK Java 8:
tomek@tomek-Lubuntu:~$ java -version
openjdk version "9-internal"
tomek@tomek-Lubuntu:~$ which java
/usr/bin/java
tomek@tomek-Lubuntu:~$ realpath /usr/bin/java
/usr/lib/jvm/java-9-openjdk-amd64/bin/java
tomek@tomek-Lubuntu:~$ ls /usr/lib/jvm/
java-1.8.0-openjdk-amd64 java-1.9.0-openjdk-amd64 java-8-openjdk-amd64 java-9-openjdk-amd64
tomek@tomek-Lubuntu:~$ export JAVA_PATH=/usr/lib/jvm/java-8-openjdk-amd64/
Wyłącz i włącz ponownie Tomcat i sprawdź, czy po ustawieniu JAVA_HOME strona JSP zaczęła działać poprawnie:
tomek@tomek-Lubuntu:~$ $CATALINA_HOME/bin/shutdown.sh
Using CATALINA_BASE: /home/tomek/apache-tomcat-8.5.23/
Using CATALINA_HOME: /home/tomek/apache-tomcat-8.5.23/
Using CATALINA_TMPDIR: /home/tomek/apache-tomcat-8.5.23//temp
Using JRE_HOME: /usr
Using CLASSPATH: /home/tomek/apache-tomcat-8.5.23//bin/bootstrap.jar:/home/tomek/apache-tomcat-8.5.23//bin/tomcat-juli.jar
tomek@tomek-Lubuntu:~$ $CATALINA_HOME/bin/startup.sh
Using CATALINA_BASE: /home/tomek/apache-tomcat-8.5.23/
Using CATALINA_HOME: /home/tomek/apache-tomcat-8.5.23/
Using CATALINA_TMPDIR: /home/tomek/apache-tomcat-8.5.23//temp
Using JRE_HOME: /usr/lib/jvm/java-8-openjdk-amd64/
Using CLASSPATH: /home/tomek/apache-tomcat-8.5.23//bin/bootstrap.jar:/home/tomek/apache-tomcat-8.5.23//bin/tomcat-juli.jar
Tomcat started.
Jeśli wszystko działa, powinieneś mieć również dostęp do dokumentacji Tomcata, która jest z nim dostarczona i domyślnie udostępniana przez sam serwer: http://localhost:8080/docs/index.html
Tomcat umożliwia kontrolę dostępu do aplikacji odpalonych na serwerze. Aplikacje mogą (ale nie muszą) korzystać z metody uwierzytalniania dostarczonych przez Tomcat.
Żeby umożlwić kontrolę dostępu, Tomcat korzysta z bazy danych użytkowników, zwanej Realm.
Realm zawiera listę nazw użytkowników, ich haseł i ról (roles).
Role pozwalają na nadawanie grupom użytkowników uprawnień. Przypominają Linuxowe grupy użytkowników.
Jeden użytkownik może mieć przypisane kilka ról.
Zadanie 4 - skonfiguruj dostęp
Wejdź na domyślną stronę dostarczoną wraz z Tomcatem: http://localhost:8080/
Spróbuj obejrzeć status serwera klikając na "Server Status".
Powinno pojawić się okienko pytające o nazwę i hasło użytkownika.
Ze względów bezpieczeństwa Tomcat nie ma zdefiniowanych domyślnych użytkowników.
Role, które umożliwiają na dostęp do aplikacji Manager są wyjaśnione tutaj: http://localhost:8080/docs/manager-howto.html#Configuring_Manager_Application_Access
Edytując plik /conf/tomcat-users.xml dodaj użytkownika "guest", przypisz mu hasło (może byc puste) i dodaj rolę "manager-status":
<tomcat-users xmlns="http://tomcat.apache.org/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
version="1.0">
<!--
NOTE: By default, no user is included in the "manager-gui" role required
to operate the "/manager/html" web application. If you wish to use this app,
you must define such a user - the username and password are arbitrary. It is
strongly recommended that you do NOT use one of the users in the commented out
section below since they are intended for use with the examples web
application.
-->
<user username="guest" password="" roles="manager-status"/>
</tomcat-users>
Spróbuj jeszcze raz zalogować się do aplikacji "manager/status".
Zadanie 5 - zarządzaj użytkownikami.
Manager to aplikacja pozwalająca na zarządzanie Tomcatem z poziomu przeglądarki.
Jest ona dostarczona domyślnie uruchamiana wraz z Tomcatem.
Jej częścią jest strona Server Status, którą odwiedzialiśmy w poprzednim zadaniu.
Spróbuj wejść na stronę menedżera: http://localhost:8080/manager/html
Ponownie edytuj plik /conf/tomcat-users.xml tym razem dodając użytkownika admin i przypisując mu rolę nadającą uprawnienia dostępu do strony managera.
Sprawdź, czy po zalogowaniu jako admin masz dostęp do menedżera.
Jeśli jesteś zalogowany jako guest, spróbuj w innej przeglądarce albo uruchom ponownie przeglądarkę.
Zadanie 6 - zarządzaj aplikacjami.
Kiedy skonfigurujemy nasz serwer, nie chcemy, by użytkownicy mieli dostęp do przykładowych aplikacji dostarczonych z Tomcatem, dlatego warto je wyłączyć.
Jedną z takich aplikacji jest aplikacja "examples", którą otwieraliśmy w zadaniu 3. (http://localhost:8080/examples/)
Spróbujemy teraz wyłączyć tę aplikację.
Wejdź na stronę menedżera: http://localhost:8080/manager/html
Zatrzymaj ("Stop") aplikację "sample", którą otwierałeś w zadaniu 3. (http://localhost:8080/example/)
Sprawdź, czy strona jest dostępna.
Zatrzymaj i uruchom ponownie serwer i sprawdź, czy teraz aplikacja sample jest dostępna.
Za pomocą "Undeploy" zatrzymaj i usuń aplikację sample.
Zatrzymaj i uruchom ponownie serwer i sprawdź, czy teraz aplikacja sample jest dostępna.
Zauważ, że aplikacja została usunięta z katalogu /webapps/sample i nie ma jej na liście aplikacji w menedżerze Tomcata.
Zadanie 7 - Dodaj nową aplikację
Dodawanie nowych aplikacji ("Deployment") odbywa się automatycznie po skopiowaniu ich do katalogu /webapps/ Możemy też zrobić to z poziomu menedżera Tomcat.
Zbuduj plik WAR z kodem z poprzednich zajęć (gałąź SpringBootEnd).
Wybierz okienko Mavena odśwież (jeżeli trzeba dodaj plik pom) i wykonaj clean, install.
W oknie drzewa projektu powinien pojawić się katalog target a w nim plik webApp.war.
Skopiuj ten plik do katalogu webapps Tomcata. Sprawdź czy działa wchodząc na link http://localhost:8080/webApp/
Jeżeli nie widzisz aplikacji wejdź w managera i wybierz opcje WAR file to deploy podając wyżej wymieniony plik.
Jeżeli aplikacja nie działą (błąd 404) sprawdź czy wersja Javy systemowa jest zgodna z wersją dla której budujemy WAR-a zapisaną w pliku POM. W przypadku niezgodności aplikacja nie będzie działać!
Exercise 7 - monitor
Spójrz na katalo z logami /logs
Sprawdź jakie informacje znajdziesz w pliku catalina.out.
Uwaga! od wersji Tomcat 9 logi aplikacji przeniesiono z pliku Catalina.out do osobnej lokalizacji:
W systemie windows logi te są widoczne w osobnym oknie uruchamianym podczas startu Tomcata.
Exercise 8 - crash
Dodaj do aplikacji linijkę
throw new OutOfMemoryError("blad");
Zbuduj aplikację za pomocą mavena i wgraj na serwer i uruchom. Zobacz czy znajdziesz błąd w logach w których logach znajdziesz błąd.
Zadanie 9 - port
Domyślnie Tomcat uruchamia się na porcie 8080. Jeżeli jakiś inny proces zajmuje już ten port to otrzymamy błąd przy uruchomieniu serwera.
Aby zmienić port wejdź w ustawienia w pliku server.xml znajdującego się w $CATALINA_HOME/conf/server.xml.
Zmień port na 8081, uruchom drugi raz Tomcata. Sprawdź w przeglądarce czy aplikacje działają na porcie 8081? Sprawdź w logach co się stało.
Zmień w pliku server.xml porty które wymagają zmiany.
Przerestartuj tomcata, tak by działały dwie osobne instancje.
Zadanie 10 - debugowanie zdeployowanej aplikacji
Wyłącz Tomcata i włącz korzystając z
export JPDA_ADDRESS=8000export JPDA_TRANSPORT=dt_socket | bin/catalina.sh jpda start
Na windows :
set JPDA_ADDRESS=8000set JPDA_TRANSPORT=dt_socketbin/catalina.bat jpda start
Address to port do nasłuchiwania przy debugowaniu.
W intellij wybierz Run -> Debug następnie Edit Configurations, w okienku Wybier z lewej strony plus i opcję Remote.
W nowo otwartym oknie zmień port na 8000 i kliknij debug. Od tego momentu jesteś podłączony debugerem do zdeployowanej aplikacji na Tomcat.
Dodaj breakpoint w 32 lini pliku IndexController.java i odśwież stronę. Powinieneś złapać się breakpointem na tej linijce!
Przykład pliku Docker dla kontenera korzystającego z Tomcata:
FROM tomcat:latest
ADD target/webApp.war /usr/local/tomcat/webapps/
EXPOSE 8080
CMD ["catalina.sh", "run"]
Gdzie
FROM — Base image on top of which our custom image is to be buildADD — Copy war file into webapps folder inside DockerEXPOSE — Expose port 8080 outside Docker containerCMD — The command to be executed when the Docker image is run
Spring Boot obejmuje wsparcie dla obrazów dockerowych z Mavena, jak i Gradle. Na przykład, chcąc zbudować obrac z Maven, wykonamy polecenie:
mvn spring-boot:build-image
Uruchomieni dockera
docker run -p 8080:8080 -t spring:1.0-SNAPSHOT