启用 Java AOT 编译打包 Solon 项目(Solon AOT)

1、Java 的 AOT(Ahead-Of-Time)

AOT(Ahead-Of-Time)编译是与 JIT(Just-In-Time)相对的一种编译方式。

在 AOT 模式下,Java 字节码(Bytecode)在程序运行之前,就被提前编译为目标平台的本地机器代码。

2、Solon AOT

Solon AOT 是 Java AOT 的增强模式。可借助容器在运行时收集相关的类信息,然后在打包时为有 "动态代理需求的类" 生成对应具体类(类名风格,Xxx$$SolonAotProxy.class)。

使用条件要求:

  • 使用 solon-maven-plugin 打包方式
  • 要求 java 17+ (java 17 后才支持 AOT)

大概的构建过程(过程为自动):

复制代码
编译(生成 .class 文件) -> Solon AOT(运行->收集->生成补充的 .class 文件) -> 打包

3、使用 solon-parent

xml 复制代码
<parent>
    <groupId>org.noear</groupId>
    <artifactId>solon-parent</artifactId>
    <version>最新版本</version>
</parent>

以 maven 打包为例,启用配置文件 native(会自动启用一批配置),然后使用 maven 的 pakage 命令即可。

补充说明:

  • 使用 maven:pakage 打包,会使用 AOT 编译,生成常规的 jar 包
  • 使用 graalvm:native:build 打包,会使用 AOT 编译,且生成 graalvm image (具体参考专题资料)

4、如果没有使用 solon-parent

以 maven 打包为例,在 pom.xml 手动添加一个 native profile(名字便取,叫 AOT 也挺好的)。之后,参考上面的说明。

xml 复制代码
<profiles>
    <profile>
        <id>native</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.noear</groupId>
                    <artifactId>solon-maven-plugin</artifactId>
                    <version>${solon.version}</version>
                    <executions>
                        <execution>
                            <id>process-aot</id>
                            <goals>
                                <goal>process-aot</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
        <dependencies>
            <dependency>
                <groupId>org.noear</groupId>
                <artifactId>solon-aot</artifactId>
            </dependency>
        </dependencies>
    </profile>
</profiles>

配置内容说明:

  • org.noear:solon-aot 依赖包,封装了 aot 的关键工作:收集类信息,生成补充类
  • solon-maven-plugin:process-aot 则是关联编译行为,在编译后,再进行 Solon AOT 二次编译
相关推荐
Hello.Reader3 分钟前
Flink DataStream API 基础构件DataStream × Partitioning × ProcessFunction
java·大数据·flink
今日说"法"4 分钟前
Rust 内存泄漏的检测与防范:超越安全的实践指南
java·安全·rust
欠你一个bug5 分钟前
Java设计模式应用--装饰器模式
java·设计模式·装饰器模式
兔兔爱学习兔兔爱学习6 小时前
Spring Al学习7:ImageModel
java·学习·spring
lang201509287 小时前
Spring远程调用与Web服务全解析
java·前端·spring
m0_564264187 小时前
IDEA DEBUG调试时如何获取 MyBatis-Plus 动态拼接的 SQL?
java·数据库·spring boot·sql·mybatis·debug·mybatis-plus
崎岖Qiu7 小时前
【设计模式笔记06】:单一职责原则
java·笔记·设计模式·单一职责原则
Hello.Reader8 小时前
Flink ExecutionConfig 实战并行度、序列化、对象重用与全局参数
java·大数据·flink
熊小猿8 小时前
在 Spring Boot 项目中使用分页插件的两种常见方式
java·spring boot·后端
paopaokaka_luck9 小时前
基于SpringBoot+Vue的助农扶贫平台(AI问答、WebSocket实时聊天、快递物流API、协同过滤算法、Echarts图形化分析、分享链接到微博)
java·vue.js·spring boot·后端·websocket·spring