聽過 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>
因為預設是 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>
比較會看不懂的是 <plugins> 標籤內的設定,那邊其實也就是設定一下我的 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/ 16:05:22 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
訪問到了!