![Search icon](https://hackernoon.imgix.net/search-new.png?w=19&h=19)
Mọi nhà phát triển đều mơ ước được làm việc với các công nghệ hiện đại và luôn cập nhật. Trên thực tế, gần như không thể xây dựng một chiến lược tuyển dụng mạnh mẽ xung quanh các công nghệ lỗi thời, lạc hậu và thường không hiệu quả, thậm chí là chết yểu.
Tuy nhiên, cuộc sống rất phức tạp và không phải mọi thứ đều phụ thuộc vào mong muốn của chúng ta.
Bạn có thể được đề nghị thăng chức và chuyển sang một dự án mà công nghệ không thay đổi hoặc không được cập nhật trong nhiều năm. Hoặc, bạn có thể có được một công việc tại công ty mơ ước của mình, nơi mà công nghệ hiện tại không thực sự hấp dẫn bạn vào lúc này. Có lẽ bạn vừa mới tốt nghiệp đại học và mong muốn có được kinh nghiệm làm việc đầu tiên, hoặc có thể bạn đã bị sa thải khỏi công việc trước đây và cần tìm việc gì đó nhanh chóng để tránh khó khăn về tài chính.
Ngoài ra còn có một kịch bản khác: trong buổi phỏng vấn, bạn được thông báo rằng bạn sẽ bắt đầu làm việc với ngăn xếp hiện tại nhưng sẽ có nhiều cơ hội để thực hiện thay đổi trong tương lai—có thể, có khả năng, nhưng...
Nhưng hãy thành thật mà nói, tất cả chỉ là triết lý. Tôi đồng ý và tôi đề xuất chúng ta hãy phân tích một trường hợp thực tế mà bạn có thể gặp phải trên con đường sự nghiệp đầy thử thách của mình.
Đối với tất cả những người hâm mộ JVM, đặc biệt là những người yêu thích Spring Framework, bài viết này dành cho bạn, hãy đọc tiếp.
BTW, tại sao bạn lại cần triển khai ứng dụng Spring Boot trên máy chủ ứng dụng khi nó có thể chạy độc lập? Xét cho cùng, đó là một trong những tính năng nổi bật của Spring Boot.
Và vì vậy, có thể có một số lý do cho điều này:
Java 8 được phát hành vào ngày 18 tháng 3 năm 2014 và mang đến những tính năng quan trọng mà chúng ta sử dụng cho đến ngày nay.
Tôi không cần phải đưa ra nhiều ví dụ, sau đây chỉ là một số ví dụ:
Biểu thức Lambda
API luồng
Lớp tùy chọn
Gói java.time (API Ngày và Giờ)
v.v.v.v.
Kể từ đó, ba phiên bản LTS đã được phát hành cho đến ngày nay ( 19/08/2024 ):
Theo một nghiên cứu do New Relic thực hiện , Java 8 vẫn được sử dụng trong 28,8% các dự án hiện tại, mà như bạn sẽ đồng ý, không phải là không đáng kể. Mặc dù thị phần của nó đang giảm dần theo từng năm, nhưng chắc chắn vẫn còn quá sớm để loại bỏ hoàn toàn công nghệ này.
Theo trang web Project Eclipse dành riêng cho Eclipse GlassFish :
Eclipse GlassFish® là một máy chủ ứng dụng hoàn chỉnh triển khai thông số kỹ thuật Jakarta EE. GlassFish bao gồm các triển khai của tất cả các API Jakarta EE bắt buộc và tùy chọn, và vượt qua tất cả các TCK Jakarta EE. GlassFish cũng bao gồm một bảng điều khiển quản trị hoàn chỉnh, hỗ trợ cụm và các công cụ và tính năng tập trung vào nhà phát triển và sản xuất khác.
Thật không may, không thể tải xuống phiên bản mới hơn 5.1.0 từ trang web này, nhưng vì chúng tôi quyết định sử dụng phiên bản dưới 5.1.0, chúng tôi sẽ phải truy cập trang web Oracle , nơi bạn có thể tìm thấy một số phiên bản cũ hơn của sản phẩm này trong phần Tải xuống. Nhưng hãy cẩn thận với giấy phép và không sử dụng bất kỳ thứ gì từ thư mục này bên ngoài hộp cát của bạn.
Chỉ cần đặt tệp phân phối ở đâu đó trên máy của bạn, điều hướng đến thư mục bin
và chạy lệnh sau:
./asadmin start-domain --verbose
Đợi một lúc, và thử mở http://localhost:4848/ , Admin Console sẽ có sẵn theo mặc định và không yêu cầu bất kỳ loại thông tin xác thực nào. Trên bảng điều khiển bên trái, bạn sẽ tìm thấy tab Applications, nếu bạn nhấp vào tab này, bạn sẽ có quyền truy cập vào menu mà bạn có thể triển khai, hủy triển khai, bật và tắt ứng dụng.
Đó là tất cả những gì bạn cần biết về GlassFish tại thời điểm này để thử triển khai ứng dụng của mình ở đó.
Có lẽ rất khó để tìm được một người trong thế giới phát triển web mà chưa từng nghe đến nền tảng phổ biến này ít nhất một lần.
Spring Boot 2 được phát hành vào năm 2021 và yêu cầu Java 8 là phiên bản tối thiểu, không giống như phiên bản 3 yêu cầu Java 17 là phiên bản tối thiểu .
Để có thể sử dụng các tính năng mới nhất, bản vá bảo mật và một số tối ưu hóa, chúng ta phải tìm phiên bản mới nhất hỗ trợ Java 8.
Và đây rồi, 2.7.18, theo blog của họ, 2.7.18 đã trở thành phiên bản mới nhất hỗ trợ Spring Boot 2.x và theo đó là Java 8 và Java 11:
Sau 5,5 năm và 121 bản phát hành, 2.7.18 đánh dấu sự kết thúc của hỗ trợ nguồn mở cho Spring Boot 2.x. Vui lòng nâng cấp lên Spring Boot 3 càng sớm càng tốt. Nếu bạn chưa sẵn sàng nâng cấp, hỗ trợ thương mại cho Spring Boot 2.7.x hiện đã có .
Cộng đồng Spring Boot cung cấp các khuyến nghị về cách chạy Ứng dụng Spring Boot trong môi trường EE + Tài liệu chính thức
Pom.xml tối thiểu và đủ để xây dựng và chạy ứng dụng sẽ trông như sau:
<?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> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.18</version> <relativePath/> </parent> <groupId>io.github.isharipov</groupId> <artifactId>sb2-to-gf4</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <exclusions> <exclusion> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-el</artifactId> </exclusion> <exclusion> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-websocket</artifactId> </exclusion> </exclusions> <scope>provided</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
Ở đây bạn cần chú ý đến hai điều:
Tôi đang đóng gói ứng dụng dưới dạng tệp war để làm rõ với máy chủ ứng dụng rằng tôi đang triển khai ứng dụng web
<packaging>war</packaging>
Tôi đang loại trừ Tomcat nhúng bằng cách thêm phụ thuộc spring-boot-starter-tomcat, loại trừ hai phụ thuộc nội bộ và thêm phạm vi được cung cấp
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <exclusions> <exclusion> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-el</artifactId> </exclusion> <exclusion> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-websocket</artifactId> </exclusion> </exclusions> <scope>provided</scope> </dependency>
Cách tiếp cận này cho phép bạn đưa Tomcat vào và chỉ sử dụng cho Spring Boot runtime, cho phép bạn chạy ứng dụng độc lập với máy chủ ứng dụng. Sự tách biệt này rất quan trọng. Spring đặt dependency này vào một thư mục riêng có tên là lib-provided trong artifact kết quả. Bây giờ bạn có ít nhất ba tùy chọn để chạy artifact kết quả:
domain-dir/autodeploy
asadmin
API - lệnh triển khaijava -jar
: spring-boot-maven-plugin tạo ra hai hiện vật - war
và war.original
. war
đơn giản bao gồm lib-provided
, còn original
thì không.Việc loại trừ các phụ thuộc sau đây cho phép chúng ta giảm kích thước hiện vật thu được:
<exclusion> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-el</artifactId> </exclusion> <exclusion> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-websocket</artifactId> </exclusion>
Để chạy ứng dụng Spring Boot trên máy chủ ứng dụng, bạn sẽ cần thực hiện hai sửa đổi đối với lớp ứng dụng chính.
Thông thường, để thiết lập một ứng dụng web đơn giản, bạn sẽ tạo một lớp công khai với phương thức main
và chú thích nó bằng chú thích @SpringBootApplication .
@SpringBootApplication public class Application { private static final Logger LOGGER = LoggerFactory.getLogger(Application.class); public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
Vì vậy, như tôi đã đề cập ở trên, có hai sửa đổi:
@SpringBootApplication public class Application extends SpringBootServletInitializer { private static final Logger LOGGER = LoggerFactory.getLogger(Application.class); public static void main(String[] args) { LOGGER.debug("From main"); SpringApplication.run(Application.class, args); } @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { LOGGER.debug("From configure"); return application.sources(Application.class); } }
Và cuối cùng nhưng không kém phần quan trọng, bạn cần thêm Deployment Descriptor
Vì vậy, trong thư mục chính → src → webapp → WEB-INF, bạn cần đặt tệp sau - glassfish-web.xml :
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd"> <glassfish-web-app> <class-loader delegate="false"/> <session-config> <session-manager/> </session-config> <jsp-config/> </glassfish-web-app>
Đọc thêm về Deployment Descriptor
Đọc thêm về Class Loader Delegation