web server apache tomcat11-34-Ahead of Time compilation support

2024-05-07 11:12

本文主要是介绍web server apache tomcat11-34-Ahead of Time compilation support,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

整理这个官方翻译的系列,原因是网上大部分的 tomcat 版本比较旧,此版本为 v11 最新的版本。

开源项目

从零手写实现 tomcat minicat 别称【嗅虎】心有猛虎,轻嗅蔷薇。

系列文章

web server apache tomcat11-01-官方文档入门介绍

web server apache tomcat11-02-setup 启动

web server apache tomcat11-03-deploy 如何部署

web server apache tomcat11-04-manager 如何管理?

web server apache tomcat11-06-Host Manager App -- Text Interface

web server apache tomcat11-07-Realm Configuration

web server apache tomcat11-08-JNDI Resources

web server apache tomcat11-09-JNDI Datasource

web server apache tomcat11-10-Class Loader

web server apache tomcat11-11-Jasper 2 JSP Engine

web server apache tomcat11-12-SSL/TLS Configuration

web server apache tomcat11-13-SSI

web server apache tomcat11-14-CGI

web server apache tomcat11-15-proxy

web server apache tomcat11-16-mbean

web server apache tomcat11-17-default-servlet

web server apache tomcat11-18-clusting 集群

web server apache tomcat11-19-load balance 负载均衡

web server apache tomcat11-20-connectors 连接器

web server apache tomcat11-21-monitor and management 监控与管理

web server apache tomcat11-22-logging 日志

web server apache tomcat11-23-APR

web server apache tomcat11-24-Virtual Hosting and Tomcat

web server apache tomcat11-25-Advanced IO and Tomcat

web server apache tomcat11-26-maven jars

web server apache tomcat11-27-Security Considerations

web server apache tomcat11-28-Windows Service

web server apache tomcat11-29-Windows Authentication

web server apache tomcat11-30-The Tomcat JDBC Connection Pool

web server apache tomcat11-31-websocket

web server apache tomcat11-32-rewrite

web server apache tomcat11-33-CDI

web server apache tomcat11-34-Ahead of Time compilation support

使用 GraalVM/Mandrel Native Image 工具构建 Tomcat 本机二进制文件

设置

本机图像工具更容易与单个 JAR 一起使用,因此该过程将使用 Maven shade 插件 JAR 打包。

其思想是生成一个包含来自 Tomcat、Web 应用程序和所有附加依赖项的所有必要类的单个 JAR。

尽管 Tomcat 已经接收了兼容性修复以支持本机图像,但其他库可能不兼容,可能需要替换代码(GraalVM 文档有更多详细信息)。

  • 下载并安装 GraalVM 或 Mandrel。
  • 从 https://github.com/apache/tomcat/tree/main/modules/stuffed 下载 Tomcat Stuffed 模块。为了方便起见,可以设置一个环境变量:
export TOMCAT_STUFFED=/绝对路径到/stuffed

构建过程现在需要 Apache Ant 和 Maven。

打包和构建

在 $TOMCAT_STUFFED 文件夹内,目录结构与常规 Tomcat 相同。主要配置文件放置在 conf 文件夹中,如果使用默认的 server.xml,则 Web 应用程序放置在 webapps 文件夹中。

所有 Web 应用程序类都需要在 Maven shade 插件和编译器在 JSP 预编译步骤期间使用。任何存在于 /WEB-INF/lib 中的 JAR 都需要作为 Maven 依赖项提供。webapp-jspc.ant.xml 脚本将从 Web 应用程序的 /WEB-INF/classes 文件夹复制类到 Maven 用作编译目标的 target/classes 路径,但如果任何 JSP 源使用它们,则它们需要打包为 JAR。

首先是使用所有依赖项构建带阴影的 Tomcat JAR。假设 Web 应用程序包含一个 $WEBAPPNAME Web 应用程序,所有 Web 应用程序中的 JSP 都必须预先编译并打包:

cd $TOMCAT_STUFFED
mvn package
ant -Dwebapp.name=$WEBAPPNAME -f webapp-jspc.ant.xml

现在应将 Web 应用程序的依赖项添加到主要的 $TOMCAT_STUFFED/pom.xml,然后构建带阴影的 JAR:

mvn package

最好尽可能避免在 Ahead of Time 编译中使用反射,因此最好将主 server.xml 配置以及用于配置上下文的 context.xml 文件生成并编译为 Tomcat 嵌入式代码。

$JAVA_HOME/bin/java\-Dcatalina.base=. -Djava.util.logging.config.file=conf/logging.properties\-jar target/tomcat-stuffed-1.0.jar --catalina -generateCode src/main/java

然后停止 Tomcat 并使用以下命令包含生成的嵌入式代码:

mvn package

这里描述的进程的其余部分将假定此步骤已完成,并且在命令行中添加了 --catalina -useGeneratedCode 参数。如果不是这种情况,则应将其删除。

本机图像配置

本机图像不支持任何形式的动态类加载或反射,除非在描述符中显式定义。生成它们使用 GraalVM 的跟踪代理,并且在某些情况下需要进行额外的手动配置。

使用 GraalVM substrate VM 及其跟踪代理运行 Tomcat:

$JAVA_HOME/bin/java\-agentlib:native-image-agent=config-output-dir=$TOMCAT_STUFFED/target/\-Dorg.graalvm.nativeimage.imagecode=agent\-Dcatalina.base=. -Djava.util.logging.config.file=conf/logging.properties\-jar target/tomcat-stuffed-1.0.jar --catalina -useGeneratedCode

现在,Web 应用程序中通往动态类加载的所有路径(例如:Servlet 访问、WebSockets 等)都需要使用将练习 Web 应用程序的脚本访问。Servlet 可能在启动时加载,而无需实际访问。监听器也可以在启动时用于加载其他类。完成后,可以停止 Tomcat。

描述符现已在代理输出目录中生成。此时必须进行进一步的配置,以添加未跟踪的项目,包括:基本接口、资源包、基于 BeanInfo 的反射等。有关此过程的更多信息,请参阅 Graal 文档。

尽管必须将所有使用的类 AOT 编译到本机图像中,但是 Web 应用程序仍必须保持不变,并且继续在 WEB-INF 文件夹中包含所有所需的类和 JAR。尽管这些类实际上不会运行或加载,但需要访问它们。

构建本机图像

如果一切都做得正确,现在可以使用 native-image 工具构建本机图像。

$JAVA_HOME/bin/native-image --report-unsupported-elements-at-runtime\--enable-http --enable-https --enable-url-protocols=http,https,jar,jrt\--initialize-at-build-time=org.eclipse.jdt,org.apache.el.parser.SimpleNode,jakarta.servlet.jsp.JspFactory,org.apache.jasper.servlet.JasperInitializer,org.apache.jasper.runtime.JspFactoryImpl\-H:+UnlockExperimentalVMOptions\-H:+JNI -H:+ReportExceptionStackTraces\-H:ConfigurationFileDirectories=$TOMCAT_STUFFED/target/\-H:ReflectionConfigurationFiles=$TOMCAT_STUFFED/tomcat-reflection.json\-H:ResourceConfigurationFiles=$TOMCAT_STUFFED/tomcat-resource.json\-H:JNIConfigurationFiles=$TOMCAT_STUFFED/tomcat-jni.json\-jar $TOMCAT_STUFFED/target/tomcat-stuffed-1.0.jar

附加的 --static 参数启用了在生成的二进制文件中

的 glibc、zlib 和 libstd++ 的静态链接。 然后运行本机图像:

./tomcat-stuffed-1.0 -Dcatalina.base=. -Djava.util.logging.config.file=conf/logging.properties --catalina -useGeneratedCode

兼容性

Servlet、JSP、EL、WebSockets、Tomcat 容器、tomcat-native、HTTP/2 在本机图像中都支持开箱即用。

在撰写本文档时,由于 Graal 不支持日志管理器配置属性,因此不支持 JULI,除了一些静态初始化器问题外,常规的 java.util.logging 记录器和实现应该使用。

如果使用默认的 server.xml 文件,则必须从配置中删除一些 Server 监听器,因为它们与本机图像不兼容,例如 JMX 监听器(不支持 JMX)和泄漏预防监听器(使用不存在于 Graal 中的内部代码)。

更好的 Tomcat 功能缺失项目:

  • java.util.logging LogManager:未实现通过系统属性进行配置,因此必须使用标准 java.util.logging 而不是 JULI
  • 静态链接配置:tomcat-native 不能进行静态链接

参考资料

https://tomcat.apache.org/tomcat-11.0-doc/cdi.html

这篇关于web server apache tomcat11-34-Ahead of Time compilation support的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/967191

相关文章

Apache 高级配置实战之从连接保持到日志分析的完整指南

《Apache高级配置实战之从连接保持到日志分析的完整指南》本文带你从连接保持优化开始,一路走到访问控制和日志管理,最后用AWStats来分析网站数据,对Apache配置日志分析相关知识感兴趣的朋友... 目录Apache 高级配置实战:从连接保持到日志分析的完整指南前言 一、Apache 连接保持 - 性

apache的commons-pool2原理与使用实践记录

《apache的commons-pool2原理与使用实践记录》ApacheCommonsPool2是一个高效的对象池化框架,通过复用昂贵资源(如数据库连接、线程、网络连接)优化系统性能,这篇文章主... 目录一、核心原理与组件二、使用步骤详解(以数据库连接池为例)三、高级配置与优化四、典型应用场景五、注意事

python web 开发之Flask中间件与请求处理钩子的最佳实践

《pythonweb开发之Flask中间件与请求处理钩子的最佳实践》Flask作为轻量级Web框架,提供了灵活的请求处理机制,中间件和请求钩子允许开发者在请求处理的不同阶段插入自定义逻辑,实现诸如... 目录Flask中间件与请求处理钩子完全指南1. 引言2. 请求处理生命周期概述3. 请求钩子详解3.1

Windows Server 2025 搭建NPS-Radius服务器的步骤

《WindowsServer2025搭建NPS-Radius服务器的步骤》本文主要介绍了通过微软的NPS角色实现一个Radius服务器,身份验证和证书使用微软ADCS、ADDS,具有一定的参考价... 目录简介示意图什么是 802.1X?核心作用802.1X的组成角色工作流程简述802.1X常见应用802.

SpringBoot项目Web拦截器使用的多种方式

《SpringBoot项目Web拦截器使用的多种方式》在SpringBoot应用中,Web拦截器(Interceptor)是一种用于在请求处理的不同阶段执行自定义逻辑的机制,下面给大家介绍Sprin... 目录一、实现 HandlerInterceptor 接口1、创建HandlerInterceptor实

Web技术与Nginx网站环境部署教程

《Web技术与Nginx网站环境部署教程》:本文主要介绍Web技术与Nginx网站环境部署教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Web基础1.域名系统DNS2.Hosts文件3.DNS4.域名注册二.网页与html1.网页概述2.HTML概述3.

SQL Server身份验证模式步骤和示例代码

《SQLServer身份验证模式步骤和示例代码》SQLServer是一个广泛使用的关系数据库管理系统,通常使用两种身份验证模式:Windows身份验证和SQLServer身份验证,本文将详细介绍身份... 目录身份验证方式的概念更改身份验证方式的步骤方法一:使用SQL Server Management S

Spring AI 实现 STDIO和SSE MCP Server的过程详解

《SpringAI实现STDIO和SSEMCPServer的过程详解》STDIO方式是基于进程间通信,MCPClient和MCPServer运行在同一主机,主要用于本地集成、命令行工具等场景... 目录Spring AI 实现 STDIO和SSE MCP Server1.新建Spring Boot项目2.a

Python使用Reflex构建现代Web应用的完全指南

《Python使用Reflex构建现代Web应用的完全指南》这篇文章为大家深入介绍了Reflex框架的设计理念,技术特性,项目结构,核心API,实际开发流程以及与其他框架的对比和部署建议,感兴趣的小伙... 目录什么是 ReFlex?为什么选择 Reflex?安装与环境配置构建你的第一个应用核心概念解析组件

Nginx使用Keepalived部署web集群(高可用高性能负载均衡)实战案例

《Nginx使用Keepalived部署web集群(高可用高性能负载均衡)实战案例》本文介绍Nginx+Keepalived实现Web集群高可用负载均衡的部署与测试,涵盖架构设计、环境配置、健康检查、... 目录前言一、架构设计二、环境准备三、案例部署配置 前端 Keepalived配置 前端 Nginx