Tomcat WAR 檔服務部屬

將 Servlet 專案打包成 war 檔,再將服務部屬到 tomcat 中。

Apache Tomcat Logo

聽過 Java 的人應該多多少少都會聽過 JAR 檔、WAR 檔... 但是有沒有真的搞懂過差別呢?

其實差別也不是說很多,他們都是 zip 格式,但是是 .jar 或 .war 的副檔名

  • JAR 的全稱是 ( Java ARchive )
  • WAR 的全稱是 ( Web Application ARchive)

在這邊先不要太較真她們真正的差異,從語義上我們可以知道 .war 是用於 Web Application ,所以我們前面寫的 Servlet 專案,都是 Web Application,就是要打包成這個 .war 檔。

pom.xml 設定

首先,要設定 war因為預設是 jar,我們要把他改成 war 檔。

<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>

比較會看不懂的是 標籤內的設定,那邊其實也就是設定一下我的 java 版本而已,有機會再開一篇說明吧!

接下來就是把我們的 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

訪問到了!