paint-brush
Quay lại tương lai: Chạy Spring Boot 2 trong GlassFish 4 bằng Java 8từ tác giả@isharipov
332 lượt đọc
332 lượt đọc

Quay lại tương lai: Chạy Spring Boot 2 trong GlassFish 4 bằng Java 8

từ tác giả ILia Sharipov8m2024/08/26
Read on Terminal Reader

dài quá đọc không nổi

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ả. Spring Boot có thể được sử dụng để triển khai các ứng dụng trên máy chủ ứng dụng khi nó có thể chạy độc lập. Java 8 vẫn được sử dụng trong 28% các dự án hiện tại.
featured image - Quay lại tương lai: Chạy Spring Boot 2 trong GlassFish 4 bằng Java 8
ILia Sharipov HackerNoon profile picture
0-item

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

  1. 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.
  2. 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
  3. Kinh nghiệm và chuyên môn khác nhau trong nhóm
  4. 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 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 ):

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

https://newrelic.com/resources/report/2024-state-of-the-java-ecosystem

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 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 ở đó.

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.

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

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

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:

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


  1. 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ả:


  • 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
    • asadmin API - lệnh triển khai
  • Chạy bằng java -jar : spring-boot-maven-plugin tạo ra hai hiện vật - warwar.original . war đơn giản bao gồm lib-provided , còn original thì không.
  • 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 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:


  1. Kế thừa lớp Application từ SpringBootServletInitializer
  2. 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

  1. Đừng ngại sử dụng công nghệ cũ
  2. Hãy luôn tò mò và phát triển kỹ năng của bạn
  3. Chúc may mắn



GitHub

Linkedin