Xây dựng ứng dụng Java Web với Maven
Trương Trần Tiến
- Mục đích: Bài viết này chúng tôi đưa ra cách build và deploy một project java web sử dụng Maven làm build tool.
- Yêu cầu kiến thức cơ bản:
o Nắm vững và sử dụng các kỹ năng để về việc xây dựng hoàn tất ứng dụng với mô hình MVC2
o Nắm vững các khái niệm về ngôn ngữ lập trình Java, lập trình thao tác hướng đối tượng.
o Nắm vững các khái niệm về lập trình web sử dụng J2EE hay JavaEE với các kiến thức về Servlet, JSP. http://www.kieutrongkhanh.net/search/label/Servlet%26JSP
o Nắm vững cách thức triển khai deploy ứng dụng độc lập trên Tomcat rời. http://www.kieutrongkhanh.net/2016/08/trien-khai-deploy-ung-dung-web-tren.html
- Tool sử dụng:
o Maven 3.6.3
o Netbeans 8.x
o JDK 8 update 66
o DBMS: SQL Server từ 2005 đến 2019
o Tomcat 8.x.x
I. Giới thiệu
- Hiện nay, khi phát triển một phần mềm chúng ta ít nhiều cũng sử dụng các build tool tích hợp trong các IDE như một công cụ đắc lực để có thể nhanh chóng compile, build, và deploy ứng dụng một cách nhanh chóng. Một trong những build tool mà chúng ta hay gặp và quen thuộc nhất là Apache Ant. Trong bài viết này, chúng ta sẽ làm quen với một build tool mới là Maven và ứng dụng nó trong việc build và deploy một ứng dụng Java Web.
II. Giới thiệu Maven
1. Cài đặt maven
- Kiểm tra JAVA_HOME trong biến môi trường chỉ đến Java JDK
- Tải file Binary zip archive từ: http://maven.apache.org/download.cgi và unzip
- Tạo mới biến môi trường có tên là MAVEN_HOME và chỉ đến thư mục Maven vửa được unzip
- Thêm đưởng dẫn cho biến Path
- Mở command prompt (nếu đang có mở cmd thì nhớ đóng lại và mở cmd mới) và gõ lệnh mvn –version để kiểm tra nếu thấy màn hình hiện như dưới thì chúng ta đã cài Maven thành công.
o Lưu ý: Restart lại máy tính để biến môi trường được cập nhật trong trường hợp câu lệnh không thực thi được
2. Cách hoạt động của Maven
- Maven hoạt động xoay quanh một POM File (Project Object Model). POM File là một file XML chứa tất cả những thông tin của project như tên project, phiên bản Java, các thư viện cần import trong project….
- POM File chỉ là nơi chỉ định cho Maven cần phải build những gì. Nhưng để chỉ định Maven build như thế nào chúng ta cần phải sử dụng các câu lệnh Maven Goal và Plugins.
- Các bước hoạt động của Maven:
o 1. Đọc file pom.xml
o 2. Kiểm tra xem local repo có các dependecy hay chưa. Nếu không có thì tải từ Central repo hay Remote repo
o 3. Thực thi các Maven Goal
o 4. Thực thi các plugins
3. POM File
- Một POM File cơ bản có cấu trúc như hình trên:
o <modelVersion>: chỉ định chúng ta đang sử POM model có version nào. Version 4.0.0 được áp dụng cho Maven 2 và 3.
o <groupId>: là ID riêng biệt của tổ chức/cá nhân tạo ra project này
o <artifactID>: là tên project hiện tại
o <version>: chỉ định version của project. Theo convention thì SNAPSHOT là phiên bản đang được phát triển và RELEASE là phiên bản ổn định.
o <packaging>: chỉ định khi build maven sẽ đóng gói project thành file được chỉ định như WAR hoặc JAR.
4. Maven Dependency và Repository
- Khi xây dựng một project sẽ khó tránh khỏi việc sử dụng các thư viện, framework từ bên thứ 3 (hay còn được gọi là dependency). Công việc tìm thư viện phù hợp hoặc tương thích cho dự án có thể là công việc khó khăn và dễ phát sinh lỗi. Để giải quyết vấn để này, Maven tích hợp thêm chức năng quản lý Dependency. Chúng ta chỉ cần khai báo dependency cần thiết trong file POM, Maven sẽ tìm kiếm và tích hợp cho chúng ta.
- Các Dependency khi được Maven quản lý sẽ được nằm ở Repository. Có 3 loại Repository:
o Local Repository: đây là thư mục nằm trên máy của chúng ta. Các project có thể sử dụng chung một Local Repository. Do vậy các thư viện chỉ cần Maven tải về 1 lần duy nhất và có thể sử dụng cho mọi Project trong máy của chúng ta. Local Repo thường nằm ở đường dẫn “C:\Users\{user-name}\.m2”
o Central Repository: đây là nới chứa các dependency được duy trì bởi cộng đồng Maven. Các công ty muốn public các thư viện của chính mình thường sẽ public trên đây để mọi người có thể tải vể sử dụng. Đây cũng chính là nới mặc định Maven sẽ tìm kiếm và tải các Dependency mà chúng ta khai báo trong file POM.
o Remote Repository: là một nơi khác mà Maven có thể tải được các Dependency. Thường thì đây là 1 Web Server nội bộ bên trong công ty không được public ra bên ngoài. Chúng ta cần phải khai báo vị trí của remote reposistory trong file pom.xml.
- Để khai báo Dependecy cho project chúng ta thực hiện các bước như sau:
o Tìm kiếm khai báo của của Dependency trên https://mvnrepository.com/.
o Copy khai báo và dán vào trong file pom.xml của project
5. Maven Build Life Cycles, Phases, Goals và Plugins
- Quy trình Maven Build một project được gọi là build life cycle. Mỗi life cycle sẽ được chia nhỏ thành các Phase. Mỗi Phase sẽ được chia nhỏ thành các Goal.
- Chúng ta cần chỉ định cho Maven rõ chúng ta muốn Maven build project như thế nào thông qua câu lệnh: mvn. Ví dụ: mvn clean install.
- Ở đây, chúng ta chỉ tìm hiểu những life cycle, phase thông dụng. Để xem rõ hơn, quý vị có thể tham khảo tại: https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
a. Maven Build Life Cycle
- Maven tích hợp sẵn 3 build life cycle:
o default: dùng liên quan đến việc compile, đóng gói.
§ Lưu ý: chúng ta không thể trực tiếp sử dụng default mà chỉ có thể sử dụng các phase trong default.
o clean: dùng liên quan dến việc xóa bỏ các file tạm hoặc built file trong project
o site: dùng liên quan đến việc tạo document như Java Doc
b. Maven Phase
- Mỗi các life cycle đểu được chia nhỏ các phase có thứ tự ưu tiên khác nhau. Khi chúng ta chỉ định thực thi một Phase thì Maven sẽ đồng thời thực thi luôn các Phase trước nó.
- Các default phase thông dụng:
o validate: đảm bảo project có đầy đủ thông tin cần thiết, các dependency đã được tải về local repository
o compile: compile source code
o test: chạy các các file test
o package: đóng gói dự án thành các file như war, jar, …
o install: đưa file đóng gói của dư án vào local reposistory để các dự án khác có thể sử dụng
c. Maven goal
- Maven goal là đon vị nhỏ nhất mà Maven sẽ trực tiếp dựa vào đó để có thể build chương trình của chúng ta. Một Maven goal có thể được tích hợp trong nhiều Maven Goal.
d. Maven plugin
- Maven plugin giúp cho chúng ta có thể thêm những hành động mà chúng ta muốn trong quá trình maven build ứng dụng chẳng hạn như đóng gói file war và deploy file đó lên server.
6. Cấu trúc một Maven project
- Thư mục src/main/java là nơi chứa các file .java
- Thư mục src/main/resources chứa các file liên quan đến dự án như file properties
- Thư mục src/main/webapp chứa thư mục WEB-INF, META-INF, html, jsp, ….
- Thư mục src/test/java chứa code để test chương trình
- Thư mục target dùng để chứ các compiled file, file war, jar, ….
7. Maven archetypes
- Maven archetypes chính là những project template có thể được tự động generate toàn bộ cấu trúc của một project java. Thay vì, chúng ta phải tự tạo từng thư mục và file pom.xml cho giống với cấu trúc của Maven cho từng project, thì chúng ta có thể sử dụng archetype. Đây cũng là cách mà các IDE sử dụng để tạo project mới cho chúng ta.
- Một số archetype thông dụng:
o maven-archetype-site-simple: project Java thông thường với 1 class – 1 main
o maven-archetype-webapp: project Java Web App
o maven-archetype-j2ee-simple: project J2EE/ JavaEE
- Cách sử dụng sẽ được hướng dẫn chi tiết tiếp theo trong nội dung bài viết này.
III. Build và deploy project Web app sử dụng Netbeans
1. Tạo project mới
- Chúng ta tiến hành mở Netbean và tạo project mới. Chúng ta chọn maven -> web application và tiến hành khởi tạo project mới.
- Khi tạo thành công, chúng ta sẽ thấy được màn hình console thông báo như sau
- Khi khởi tạo xong, cấu trúc project của chúng ta sẽ như sau
- Lưu ý: trong lúc khởi tạo Project chúng ta có thể gặp lỗi “No plugin found for prefix 'archetype' in the current project and in the plugin groups [org.apache.maven.plugins, org.codehaus.mojo] available from the repositories [local (C:\Users\ironl\.m2\repository), central (http://repo.maven.apache.org/maven2)] -> [Help 1]” như hình dưới.
- Lỗi này xảy ra do Netbean 8.2 khi kết nối với Central Repository sử dụng HTTP nhưng để kết nối với Central Repo ở thời điểm hiện tại cần kết nối với HTTPS. Để sửa lỗi này chúng ta cần chỉnh sửa file setting.xml trong folder .m2 như hình dưới.
2. Cấu hình file pom.xml
a. Cấu hình plugin
- Vì Netbean 8.2 là phiên bản cũ nên khi generate file pom.xml có thể sẽ gặp trục trặc trong việc tương thích. Vì vậy chúng ta sẽ chỉnh sửa cấu hình file pom.xml để dễ dàng trong việc build project.
- Chúng ta tiến hành bằng việc xóa các tag <plugin> và thêm các tag <plugin> mới.
- Ở đây, chúng ta chú ý đến “tomcat7-maven-plugin”, đây là plugin cho phép chúng ta có thể embedded tomcat vào trong project hoặc có thể sử dụng để deploy đến tomcat rời (sẽ được hướng dẫn ở phần dưới). Khi sử dụng embedded tomcat thì plugin này sẽ tạo ra Tomcat 7, nhưng nếu deploy tomcat rời thì deploy trên tomcat version nào cũng được.
b. Add các dependency cần thiết
- Khi NetBeans generate project, thì file pom.xml đã có sẵn dependency của JavaEE 7. Chúng ta chỉ cần khai báo thêm dependency của JSTL 1.2 và JDBC.
- Chúng ta có thể nhận dạng việc viết đúng cú pháp thông qua cửa sổ project với các dependency được add và có dấu chấm cảm màu vàng thể hiện chưa được download
3. Chạy maven goal để kiểm tra cấu hình file pom.xml
- Chúng ta thực hiện chạy maven clean install để maven tải các dependency cần thiết.
- Chúng ta click phải chuột vào tên project trong cửa sổ Project nằm bên trong Netbeans, chọn Run Maven → Goals để khởi tạo goal cho maven như sau
- Chúng ta nhập giá trị vào các ô như hình bên dưới
- Nhấn nút OK, chương trình sẽ download các thư viện và build ứng dụng. Kết quả, chúng ta thành Build success là đạt yêu cầu cùng với các thư viện đã được download (các dấu chấm cảm trên dependencies sẽ không còn nữa)
4. Cấu hình Datasource
a. Cấu hình Datasource trong context.xml
b. Tạo WEB-INF, web.xml
- Vì project vẫn chưa có thư mục WEB-INF và file web.xml nên chúng ta tiến hành tạo thư mục WEB-INF và add thêm web.xml vào thư mục “Web Pages”
- Đồng thời chúng ta cấu hình resource trong web.xml
5. Tạo class DBHelpers, DAOs, DTOs
- Chúng ta tạo class DBHelpers trong package com.tientt.demomaven.utils
- Chúng ta tiếp tục tạo các class DAO, DTO tương ứng cho Table của chúng ta sẽ thực hiện ứng dụng trong bài
- Class DTO
- Class DAO
6. Tạo LoginServlet
7. Tạo login.jsp và main.jsp
- Đồng thời chúng ta cập nhập welcome-file-list ở web.xml
8. Chạy maven embedded tomcat plugin
- Chúng ta thực hiện chạy maven clean install tomcat7:run để clean and build và chạy project trong embedded tomcat server.
- Nhấn OK để chạy maven goal. Khi đó maven sẽ chạy ứng dụng và gọi các class cần thiết trong gói thư viện tomcat. Việc này ngược lại với concept bình thường khi deploy ứng dụng là container sẽ gọi ứng dụng, việc này tạo ra sự đơn giản hơn khi phát triển ứng dụng.
- Chúng ta truy cập vào đường dẫn được deploy trên trình duyệt vào để xem kết quả.
9. Deploy ứng dụng trên Tomcat rời
a. Cấu hình file pom.xml
- Trong trường hợp chúng ta có một server tomcat sẵn và mong muốn deploy ứng dụng trên server đó và không chạy và run một server embedded riêng biệt như các bước đã nêu trên. Maven sẽ hỗ trợ chúng ta điều đó.
- Ở đây là mặc định Netbeans đã hỗ trợ sẵn một Tomcat trong đó, cụ thể là apache tomcat 8.0.27. Do vậy, chúng ta sẽ bổ sung cấu hình vào file pom.xml như sau
- Vấn đề là username và password sẽ lấy như thế nào. Chúng ta truy cập vào đường dẫn tomcat-base của server tomcat (hay có tên gọi là cache server của tomcat được cấu hình trong netbeans). Chúng ta thực hiện tìm đường dẫn này như sau:
o Tại cửa sổ Services trong Netbeans, chúng ta chọn Servers, và click phải chuột trên Apache Tomcat 8.0.27.0, chọn Properites
o Cửa sổ properties xuất hiện
o Chúng ta đi đến đường dẫn của Catalina Base. Sau đó, đi đến thư mục conf, tìm tập tin tomcat-users.xml mở nó lên
o Chúng ta sẽ lấy được username và password của manager-script, ở đây ví dụ sẽ là
b. Chạy maven tomcat plugin
- Chúng ta start server tomcat và chạy maven goal “clean install tomcat7:deploy”. Chúng ta có thể sử dụng tomcat7:redeploy để deploy lại hoặc tomcat7:undeploy để undeploy ứng dụng khỏi Server.
- Khi deploy thành công chúng ta sẽ thấy màn hình console thông báo như sau:
- Kết quả test sẽ tương tự không gì thay đổi. Với ứng dụng được deploy thành công, chúng ta nhìn thấy trong server tomcat có xuất hiện context path của ứng dụng như hình bên dưới.
IV. Generate, build và deploy project Java Web sử dụng command promt
1. Tạo Maven Archtypes
- Chúng ta tiến hành tạo project thông qua sử dụng Maven Archetypes. Mở Command Promt và chỉ đển đường dẫn thư mục sẽ chứa project
- Gõ “mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DarchetypeVersion=1.4”
o Vì có tới hàng ngàn archetypes nên chúng ta cần chỉ định rõ chúng ta sẽ sử dụng archetype của ai, loại gì và version mấy
o Các parameter “-DarchetypeGroupId”, ” -DarchetypeArtifactId”, “-DarchetypeVersion” tương tự như <groupId>, <artifactId>, <version> trong khai báo dependency ở file pom.xml
- Nhấn Enter và chờ maven cấu hình. Khi xong, Maven sẽ đưa ra màn hình như sau và chúng ta nhập các thông tin của project như groupID, artifactID,
- Khi Maven generate project thành công chúng ta sẽ nhìn thấy màn hình như bên dưới và thư mục chứa project của chúng ta được tạo ra theo đúng cấu trúc của maven
- Đến đây chúng ta chỉ cần config file pom.xml và code như phần trên là được.
- Chú ý: khi sử dụng archetype như trên thì web.xml được tạo ra dành cho JSP 1.2 / Servlets 2.3. Nếu chúng ta muốn sử dụng JSP 2.2 / Servlets 3.0 thì phải sửa lại web.xml.
2. Build và deploy trên Tomcat
- Sau khi config pom.xml chúng ta mở command promt. Chỉ đến thư mục project chứa file pom.xml và gõ “mvn clean install tomcat7: run”. Hoặc gõ “mvn clean install tomcat7:deploy” tùy vào chúng ta muốn sử dụng Tomcat Embbeded hay sử dụng Tomcat rời.
- Kết quả sẽ được thông báo giống hết như khi chúng ta thực hiện deploy ở Netbeans.
Chúng ta vừa hoàn tất tìm hiểu vể build tool Maven và đồng thời áp dụng vào việc build và deploy ứng dụng Java Web Application trên server Tomcat.
Rất mong quí vị góp ý về nội dung bài viết này vì bài viết chúng tôi sẽ cung cấp cho quí vị các nội dung về cách làm và chia sẻ các tình huống lỗi thường xuất hiện trong quá trình phát triển. Chúng tôi mong muốn quí vị cùng chia sẻ những lỗi và cách khắc phục khi quí vị phát triển ứng dụng hay thực hiện theo các hướng dẫn của bài viết như là một sự chia sẽ chung cho người đọc khác. Hẹn gặp lại quí vị ở các bài viết sau.
ok
Trả lờiXóa