![Search icon](https://hackernoon.imgix.net/search-new.png?w=19&h=19)
每位开发人员都梦想着使用现代技术并保持最新状态。事实上,围绕过时、陈旧、通常无效甚至夭折的技术制定强有力的招聘策略几乎是不可能的。
然而,生活是复杂的,并非所有事情都取决于我们的意愿。
你可能会升职,并被调到一个多年来技术没有改变或更新的项目。或者,你可能会在你梦想中的公司找到一份工作,但目前你对那里当前的技术栈并不特别感兴趣。也许你刚刚大学毕业,渴望获得第一份工作经验,或者你被以前的工作解雇了,需要尽快找一份新工作以避免经济困难。
还有另一种情况:在面试过程中,你被告知将开始使用当前的堆栈,但将来会有很多机会做出改变 - 也许,可能,但是......
但说实话,这只是哲学。我同意,我建议我们分析一个你在充满挑战的职业道路上可能遇到的真实案例。
对于所有 JVM 堆栈的粉丝,尤其是那些喜欢 Spring 框架的人来说,这篇文章适合你,请继续阅读。
顺便说一句,既然Spring Boot应用程序可以独立运行,为什么还需要在应用程序服务器上部署它呢?毕竟,这是 Spring Boot 的突出功能之一。
因此,造成这种情况的原因可能有以下几个:
Java 8 于 2014 年 3 月 18 日发布,带来了我们至今仍在使用的里程碑功能。
我不需要举太多的例子,这里只是其中的一些:
Lambda 表达式
流 API
可选类
java.time 包(日期和时间 API)
等等等等
从那时起,到今天( 2024 年 8 月 19 日)已经发布了三个 LTS 版本:
根据New Relic 的一项研究,Java 8 仍在当前 28.8% 的项目中使用,这一点并不小。虽然其份额逐年下降,但完全否定这项技术还为时过早。
根据专门针对 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 的全部信息,以便尝试在那里部署您的应用程序。
在 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 的商业支持可用。
Spring Boot 社区提供了如何在 EE 环境中运行 Spring Boot 应用程序的建议+ 官方文档
构建和运行应用程序的最小且足够的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>
这里需要注意两点:
我将应用程序打包为 war 文件,以便应用程序服务器清楚知道我正在部署一个 Web 应用程序
<packaging>war</packaging>
我正在排除嵌入式 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 的单独文件夹中。现在,您至少有三个选项可以运行结果工件:
domain-dir/autodeploy
下的 autodeploy 目录asadmin
API -部署命令java -jar
运行: spring-boot-maven-plugin 创建两个工件 - war
和war.original
。简单war
包含lib-provided
, original
war 不包含。排除以下依赖项允许我们减少生成的工件大小:
<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); } }
因此,正如我上面提到的,有两项修正案:
@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>
阅读有关部署描述符的更多信息
阅读有关类加载器委托的更多信息