paint-brush
回到未来:使用 Java 8 在 GlassFish 4 中运行 Spring Boot 2经过@isharipov
268 讀數

回到未来:使用 Java 8 在 GlassFish 4 中运行 Spring Boot 2

经过 ILia Sharipov8m2024/08/26
Read on Terminal Reader

太長; 讀書

每个开发人员都梦想着使用现代技术并保持最新状态。事实上,围绕过时、陈旧且通常无效的技术制定强大的招聘策略几乎是不可能的。当 Spring Boot 可以独立运行时,它可用于在应用程序服务器上部署应用程序。目前 28% 的项目仍在使用 Java 8。
featured image - 回到未来:使用 Java 8 在 GlassFish 4 中运行 Spring Boot 2
ILia Sharipov HackerNoon profile picture
0-item

否认、愤怒、讨价还价、沮丧……

每位开发人员都梦想着使用现代技术并保持最新状态。事实上,围绕过时、陈旧、通常无效甚至夭折的技术制定强有力的招聘策略几乎是不可能的。


然而,生活是复杂的,并非所有事情都取决于我们的意愿。


你可能会升职,并被调到一个多年来技术没有改变或更新的项目。或者,你可能会在你梦想中的公司找到一份工作,但目前你对那里当前的技术栈并不特别感兴趣。也许你刚刚大学毕业,渴望获得第一份工作经验,或者你被以前的工作解雇了,需要尽快找一份新工作以避免经济困难。


还有另一种情况:在面试过程中,你被告知将开始使用当前的堆栈,但将来会有很多机会做出改变 - 也许,可能,但是......


验收…

但说实话,这只是哲学。我同意,我建议我们分析一个你在充满挑战的职业道路上可能遇到的真实案例。


对于所有 JVM 堆栈的粉丝,尤其是那些喜欢 Spring 框架的人来说,这篇文章适合你,请继续阅读。


顺便说一句,既然Spring Boot应用程序可以独立运行,为什么还需要在应用程序服务器上部署它呢?毕竟,这是 Spring Boot 的突出功能之一。


因此,造成这种情况的原因可能有以下几个:

  1. 您可能已在 GlassFish 或其他 EE 应用服务器中设置了用于部署应用程序的基础架构。在这种情况下,EE 应用服务器已安装、配置并完全受支持。即使应用程序可以独立运行(如使用 Spring Boot 一样),您仍需要准备和维护用于部署和运行时的基础架构。
  2. 您知道一段时间后您将开始放弃应用服务器,因此提前开始使用将来会用到的技术,并有可能在当前环境中使用它
  3. 团队中存在不同的经验和专业知识
  4. 实验和假设检验

Java 8

Java 8 于 2014 年 3 月 18 日发布,带来了我们至今仍在使用的里程碑功能

我不需要举太多的例子,这里只是其中的一些:

  • Lambda 表达式

  • 流 API

  • 可选类

  • java.time 包(日期和时间 API)

  • 等等等等


从那时起,到今天( 2024 年 8 月 19 日)已经发布了三个 LTS 版本

  • Java SE 11(55) — 2018 年 9 月 25 日
  • Java SE 17(61) — 2021 年 9 月 14 日
  • Java SE 21(65) - 2023 年 9 月 19 日


根据New Relic 的一项研究,Java 8 仍在当前 28.8% 的项目中使用,这一点并不小。虽然其份额逐年下降,但完全否定这项技术还为时过早。

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

GlassFish 4.1.2

根据专门针对 Eclipse GlassFish 的 Project Eclipse 网站


Eclipse GlassFish® 是一款完整的应用服务器,可实现 Jakarta EE 规范。GlassFish 包括所有必需和可选的 Jakarta EE API 的实现,并通过了所有 Jakarta EE TCK。GlassFish 还包括完整的管理控制台、集群支持以及其他以开发人员和生产为中心的工具和功能。


不幸的是,无法从该网站下载低于 5.1.0 的版本,但由于我们决定使用低于 5.1.0 的版本,因此我们将不得不访问Oracle 网站,您可以在下载部分找到该产品的几个早期版本。但请注意许可证,不要在沙盒之外使用此文件夹中的任何内容。


只需将分发文件放在机器上的某个位置,导航到bin文件夹,然后运行以下命令:

 ./asadmin start-domain --verbose


等待一段时间,然后尝试打开http://localhost:4848/ ,管理控制台应该默认可用,并且不会要求任何类型的凭据。在左侧面板上,您将看到“应用程序”选项卡,如果单击它,您将可以访问一个菜单,您可以使用该菜单部署、取消部署、启用和禁用应用程序。


这就是您目前需要了解的有关 GlassFish 的全部信息,以便尝试在那里部署您的应用程序。

Spring Boot 2

在 Web 开发领域,很难找到一个没有听说过这个流行框架的人。

Spring Boot 2 于 2021 年发布,要求最低版本为 Java 8,而版本 3 则要求最低版本为 Java 17


为了能够使用最新的功能、安全补丁和一些优化,我们必须找到支持 Java 8 的最新版本。


这就是 2.7.18,根据他们的博客,2.7.18 成为支持 Spring Boot 2.x 的最新版本,因此支持 Java 8 和 Java 11:

经过 5.5 年和 121 个版本,2.7.18 标志着 Spring Boot 2.x 开源支持的结束。请尽快升级到 Spring Boot 3。如果您尚未准备好升级,Spring Boot 2.7.x 的商业支持可用

开始一起使用它们

先决条件:

  • Java 8
  • GlassFish 4.1.2
  • Spring Boot 2.7.18
  • Maven


Spring Boot 社区提供了如何在 EE 环境中运行 Spring Boot 应用程序的建议+ 官方文档

pom.xml

构建和运行应用程序的最小且足够的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>


这里需要注意两点:

  1. 我将应用程序打包为 war 文件,以便应用程序服务器清楚知道我正在部署一个 Web 应用程序


    <packaging>war</packaging>


  1. 我正在排除嵌入式 Tomcat,添加 spring-boot-starter-tomcat 依赖项,排除两个内部依赖项并添加提供的范围


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


这种方法允许您包含 Tomcat 并使其仅适用于 Spring Boot 运行时,从而使您可以独立于应用程序服务器运行应用程序。这种分离很重要。Spring 将此依赖项放入结果工件中名为lib-provided 的单独文件夹中。现在,您至少有三个选项可以运行结果工件:


  • 部署到 GlassFish - 基本上, 有三种方法可以部署应用程序
    • GlassFish 管理 GUI
    • 将存档文件复制到domain-dir/autodeploy下的 autodeploy 目录
    • asadmin API -部署命令
  • 使用java -jar运行: spring-boot-maven-plugin 创建两个工件 - warwar.original 。简单war包含lib-providedoriginal war 不包含。
  • 在您最喜欢的 IDE 中启动应用程序 - 对于 IntelliJ IDEA 社区版,您需要在运行/调试配置下添加以下选项

排除以下依赖项允许我们减少生成的工件大小:


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


应用程序类

要在应用程序服务器上运行 Spring Boot 应用程序,您需要对主应用程序类进行两处修改。

通常,要设置一个简单的 Web 应用程序,您可以创建一个具有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); } }


因此,正如我上面提到的,有两项修正案:


  1. SpringBootServletInitializer继承 Application 类
  2. 重写受保护的 SpringApplicationBuilder configure(SpringApplicationBuilder builder)方法


@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); } }


部署描述符

最后但同样重要的是,您需要添加部署描述符

因此,在 main → src → webapp → WEB-INF 文件夹下,您需要放置以下文件 - 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>


阅读有关部署描述符的更多信息

阅读有关类加载器委托的更多信息

总结

  1. 不要害怕使用旧技术
  2. 保持好奇心并不断发展你的技能
  3. 祝你好运



GitHub

LinkedIn