Tomcat WAR 檔服務部屬
將 Servlet 專案打包成 war 檔,再將服務部屬到 tomcat 中。
聽過 Java 的人應該多多少少都會聽過 JAR 檔、WAR 檔... 但是有沒有真的搞懂過差別呢?
其實差別也不是說很多,他們都是 zip 格式,但是是 .jar 或 .war 的副檔名
- JAR 的全稱是 ( Java ARchive )
- WAR 的全稱是 ( Web Application ARchive)
在這邊先不要太較真她們真正的差異,從語義上我們可以知道 .war 是用於 Web Application ,所以我們前面寫的 Servlet 專案,都是 Web Application,就是要打包成這個 .war 檔。
pom.xml 設定
首先,要設定
<packaging>war</packaging>
這樣就好了!
把我的設定檔貼上來給大家看看吧!
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<properties>
<java.version>11</java.version>
</properties>
<groupId>com.judysocute</groupId>
<artifactId>servlet-tutorial</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<build>
<finalName>servlet-tutorial</finalName> <!-- 設定打包後檔名 -->
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>11</source>
<target>11</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
比較會看不懂的是
接下來就是把我們的 war 檔建立起來囉! 先 cd 到我們的專案目錄,先把專案相依性下載過一次。
$ mvn install
# ... 略過 ...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.053 s
[INFO] Finished at: 2020-05-31T16:00:04+08:00
[INFO] ------------------------------------------------------------------------
使用 mvn package 指令打包專案
$ mvn package
# ... 略過 ...
[INFO] WEB-INF/web.xml already added, skipping
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.920 s
[INFO] Finished at: 2020-05-31T16:01:53+08:00
[INFO] ------------------------------------------------------------------------
這樣就完成了!而我們的 WAR 檔就會建立在 target 資料夾之下囉!
ls target/
classes generated-sources maven-archiver
maven-status servlet-tutorial servlet-tutorial.war
這個 servlet-tutorial.war 就是我們要的檔案囉! 再來把 war 檔拉到 tomcat 資料夾下的 webapps 資料夾就好了!
apache-tomcat-9.0.31
├── BUILDING.txt
├── CONTRIBUTING.md
├── LICENSE
├── NOTICE
├── README.md
├── RELEASE-NOTES
├── RUNNING.txt
├── bin
├── conf
├── lib
├── logs
├── temp
├── webapps ## ← 這裡
└── work
可以看到 webapps 資料夾裡面已經有不止一個 war 檔了,丟進去之後,照著 上一篇 的方法把服務部屬起來,再訪問 http://localhost:8080/servlet-tutorial/xxx 就會看到服務囉! ( xxx 是我們在 @WebServlet() 定義的 )
@WebServlet(
name = "HelloWorld",
urlPatterns = {"/hello-world", "/hello-world2", "/hello"},
loadOnStartup = 1
)
public class HelloWorld extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();
writer.println("<!DOCTYPE html>");
writer.println("<html>");
writer.println("<head>");
writer.println("<title>Hello! Servlet!</title>");
writer.println("</head>");
writer.println("<body>");
writer.println("<h1>Hello! World!</h1>");
writer.println("</body>");
writer.println("</html>");
}
}
如果是這樣的 Servlet 就可以用
http://localhost:8080/servlet-tutorial/hello-world
http://localhost:8080/servlet-tutorial/hello-world2
http://localhost:8080/servlet-tutorial/hello
訪問到了!