Phủ nhận, tức giận, mặc cả, chán nản… 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... Sự chấp nhận… 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 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. Spring Boot Và vì vậy, có thể có một số lý do cho điều này: Bạn có thể đã thiết lập cơ sở hạ tầng để triển khai ứng dụng trong GlassFish hoặc EE Application Server khác. Trong trường hợp này, EE Application Server được cài đặt, cấu hình và hỗ trợ đầy đủ. Ngay cả khi ứng dụng có thể chạy độc lập, như với Spring Boot, bạn vẫn cần chuẩn bị và duy trì cơ sở hạ tầng để triển khai và chạy. Bạn biết rằng sau một thời gian, bạn sẽ bắt đầu từ bỏ máy chủ ứng dụng và do đó bắt đầu sử dụng trước công nghệ mà bạn sẽ sử dụng trong tương lai với khả năng sử dụng nó trong môi trường hiện tại Kinh nghiệm và chuyên môn khác nhau trong nhóm Thí nghiệm và kiểm tra giả thuyết Java 8 Java 8 được phát hành vào ngày 18 tháng 3 năm 2014 và mang đến mà chúng ta sử dụng cho đến ngày nay. những tính năng quan trọng 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ừ đó, đã được phát hành cho đến ngày nay ( ): ba phiên bản LTS 19/08/2024 Java SE 11(55) - 25 tháng 9 năm 2018 Java SE 17(61) - Ngày 14 tháng 9 năm 2021 Java SE 21(65) - ngày 19 tháng 9 năm 2023 Theo một , 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. nghiên cứu do New Relic thực hiện Cá thủy tinh 4.1.2 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 , 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. trang web Oracle 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 và chạy lệnh sau: bin ./asadmin start-domain --verbose Đợi một lúc, và thử mở , 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. http://localhost:4848/ Đó 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 ở đó. Khởi động mùa xuân 2 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. 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ư . Spring Boot 2 được phát hà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 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: blog 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ó Bắt đầu sử dụng chúng cùng nhau Điều kiện tiên quyết: Java 8 Cá thủy tinh 4.1.2 Khởi động mùa xuân 2.7.18 Maven Cộng đồng Spring Boot về cách chạy Ứng dụng Spring Boot trong môi trường EE + cung cấp các khuyến nghị 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: Pom.xml <?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à 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ả: lib-provided Triển khai trên GlassFish - về cơ bản, : có ba cách để triển khai ứng dụng Giao diện quản trị GlassFish Sao chép tệp lưu trữ của bạn vào thư mục autodeploy trong domain-dir/autodeploy API - lệnh asadmin triển khai Chạy bằng : hai hiện vật - và . đơn giản bao gồm , còn thì không. java -jar spring-boot-maven-plugin tạo ra war war.original war lib-provided original Khởi động ứng dụng trong IDE yêu thích của bạn - đối với IntelliJ IDEA Community Edition, bạn cần thêm tùy chọn sau vào Cấu hình Chạy/Gỡ lỗi 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> Lớp ứng dụng Để 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 và chú thích nó bằng chú thích . main @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: Kế thừa lớp Application từ SpringBootServletInitializer Ghi đè phương thức configure(SpringApplicationBuilder builder) được bảo vệ của SpringApplicationBuilder @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); } } Mô tả triển khai 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 Kết thúc Đừng ngại sử dụng công nghệ cũ Hãy luôn tò mò và phát triển kỹ năng của bạn Chúc may mắn GitHub Linkedin