用 aws-sdk-java-v2 的 archetype-app-quickstart 生成 AWS Java SDK 2.x 应用:项目结构、构建与 GraalVM 原生镜像实战 用 aws-sdk-java-v2 的 archetype-app-quickstart 生成 AWS Java SDK 2.x 应用项目结构、构建与 GraalVM 原生镜像实战【免费下载链接】aws-sdk-java-v2The official AWS SDK for Java - Version 2项目地址: https://gitcode.com/GitHub_Trending/aw/aws-sdk-java-v2本文以 aws-sdk-java-v2 仓库中archetype-app-quickstart原型Archetype生成的示例应用为对象系统讲解生成工程的目录结构、各核心源文件职责、Maven 构建流程以及可选的 GraalVM Native Image 原生镜像打包与运行方式。读完本文你将掌握如何基于该原型快速搭建一个接入 AWS Java SDK 2.x 的 Maven 应用并能通过一条-P native-image命令将其编译为可直接执行的本地可执行文件。一、原型与关联文档定位archetype-app-quickstart是 aws-sdk-java-v2 仓库archetypes 目录中提供的一个 Maven Archetype其用途正如 pom.xml 中描述The AWS SDK for Java - Maven archetype for a sample application using AWS Java SDK 2.x——即用于生成一个内嵌 AWS Java SDK 2.x 依赖的示例 Maven 应用骨架。本篇文章所依托的关联文档是仓库集成测试数据中nettyclient测试项目archetypes/archetype-app-quickstart/src/test/resources/projects/nettyclient/下reference/README.md的生成结果。该 README 由 Archetype 的 Velocity 模板archetype-resources/README.md渲染生成代表以 Netty NIO 作为 HTTP 客户端、启用原生镜像这一配置组合下产物的标准使用说明。下文所有项目结构、命令与源码均来自仓库中该测试项目的 reference 目录可直接对照验证。二、生成工程的前提条件Prerequisites生成并构建该应用需要以下环境缺一不可Java 1.8生成工程的pom.xml默认将maven.compiler.source/maven.compiler.target设为1.8见模板 pom.xml因此至少需要 JDK 8Apache Maven用于执行mvn构建命令GraalVM Native Image可选仅在需要将应用编译为原生镜像时安装且要求环境中存在native-image工具。三、生成项目的目录结构mvn archetype:generate执行完毕后得到一个如下结构的 Maven 工程├── src │ ├── main │ │ ├── java │ │ │ └── package │ │ │ ├── App.java │ │ │ ├── DependencyFactory.java │ │ │ └── Handler.java │ │ └── resources │ │ └── simplelogger.properties │ └── test │ └── java │ └── package │ └── HandlerTest.java三个核心源码文件的职责在 README 中定义得非常清晰并在仓库的 nettyclient 参考实现reference/src/main/java/software/amazonaws/test/中有对应代码App.java应用的主入口main 方法DependencyFactory.java负责创建 SDK 客户端实例Handler.java业务处理器在这里使用 SDK 客户端发起 API 调用。3.1 主入口 App.java参考实现App.java展示了一个典型的启动流程public class App { private static final Logger logger LoggerFactory.getLogger(App.class); public static void main(String... args) { logger.info(Application starts); Handler handler new Handler(); handler.sendRequest(); logger.info(Application ends); } }它通过 SLF4J 记录启动与结束日志实例化Handler并触发sendRequest()整体骨架非常轻量便于用户替换为真实的业务逻辑。3.2 客户端工厂 DependencyFactory.javaDependencyFactory.java 是整个生成的工程中与 AWS SDK 结合最紧密的部分public class DependencyFactory { private DependencyFactory() {} public static S3AsyncClient s3Client() { return S3AsyncClient.builder() .httpClientBuilder(NettyNioAsyncHttpClient.builder()) .build(); } }注意两点关键事实HTTP 客户端与service参数联动此处选择 netty 测试项目因此生成的是S3AsyncClient异步客户端并显式装配NettyNioAsyncHttpClient。这一装配关系由 Archetype 的 Velocity 模板archetype-resources/src/main/java/DependencyFactory.java动态生成其中${serviceClientClassName}、${httpClientClassName}等占位符由 archetype-tools 提供的serviceMapping.vm/global.vm映射表在打包时展开service选择决定客户端类型若选择 Apache HttpClient 等同步客户端配置生成的将是同步客户端如S3Client对应工厂方法代码会随之变化。3.3 业务处理器 Handler.javaHandler.java 在构造阶段通过DependencyFactory.s3Client()注入客户端public class Handler { private final S3AsyncClient s3Client; public Handler() { s3Client DependencyFactory.s3Client(); } public void sendRequest() { // TODO: invoking the api calls using s3Client. } }sendRequest()中预留了 TODO即文档所述you can invoke the api calls using the SDK client here——用户在此处使用s3Client编写实际的 AWS API 调用。3.4 测试与日志配置HandlerTest.java 是基于 JUnit 5org.junit.jupiter的测试骨架同样以 TODO 占位simplelogger.properties 是 SLF4J SimpleLogger 的配置文件预置了实用设置默认日志级别info、SDK 请求日志software.amazon.awssdk.requestdebug、开启时间戳格式yyyy-MM-dd HH:mm:ss:SSS Z与线程名输出。四、构建项目在生成工程的根目录执行mvn clean package该命令会依次完成编译、运行测试HandlerTest、打包 JAR 的完整流程。构建由生成工程的 pom.xml 驱动其依赖设计有两点值得说明通过 BOM 统一版本在dependencyManagement中导入software.amazon.awssdk:bom版本由构建参数javaSdkVersion决定从而无需为各 SDK 模块单独声明版本号HTTP 客户端互斥排除服务模块如s3会同时排除netty-nio-client与apache-client传递依赖再由显式声明的${httpClient}依赖此处为netty-nio-client作为唯一 HTTP 客户端实现避免运行时出现多个客户端实现冲突。五、构建 GraalVM 原生镜像当生成项目时选择启用原生镜像nativeImagetrue对应 nettyclient 测试项目的 archetype.properties 配置README 会额外提供原生镜像构建章节。前提是环境中已安装native-image工具即 GraalVM Native Image然后执行mvn clean package -P native-image构建结束后生成的原生可执行文件位于target目录中直接运行即可target/${artifactId}在 nettyclient 参考工程中artifactId为test-apache-artifact因此实际命令为target/test-apache-artifact。5.1 原生镜像构建的底层实现原生镜像能力由 pom.xml 中的 native-image profile 提供它引用了org.graalvm.buildtools:native-maven-plugin版本 0.9.6关键配置为imageName镜像名取${artifactId}mainClass指向${package}.AppbuildArgs追加--verbose、--no-fallback禁用回退到 JVM 模式以及--initialize-at-build-timeorg.slf4j将 SLF4J 日志框架在构建期完成静态初始化规避原生镜像下的类初始化时序问题。六、原型如何驱动这些差异archetype-metadata.xml 与 Velocity 模板生成内容的差异化完全由原型的元数据与模板机制控制理解它有助于按需定制生成结果。6.1 必填属性requiredPropertiesarchetype-metadata.xml 定义了原型交互式询问的属性及其校验规则属性默认值校验正则 / 可选值说明javaSdkVersion${project.version}原型自身版本\d\.\d.\dAWS Java SDK 版本号写入 BOM 版本service无无必填目标 AWS 服务如s3决定服务模块与客户端类httpClient无url-connection-client、apache-client、netty-nio-clientHTTP 客户端实现nativeImage无true/false是否生成原生镜像构建 profile 与 README 章节credentialProviderdefaultdefault/identity-center凭证提供方identity-center会额外引入sso与ssooidc依赖见模板 pom.xml6.2 文件集与条件渲染fileSetssrc/main/java、src/test/java按packagedtrue进行包名重命名simplelogger.properties、.gitignore、README.md则按filteredtrue做属性过滤条件渲染README 模板中的原生镜像章节被#if( $nativeImage true)包裹见 archetype-resources/README.mdpom.xml中graalvm.native.maven.plugin.version属性同理因此只有启用原生镜像的生成工程才会出现-P native-image相关内容——这正是 nettyclient 参考 README 包含该章节、而apachehttpclientwithoutnativeimage测试项目 README 不包含的原因archetype-tools 协作global.vm与serviceMapping.vm来自 archetype-tools 构件通过 pom.xml 中的 maven-dependency-plugin 在process-classes阶段解包复制到模板目录供各模板#parse引用实现service → 客户端类名/包名的映射。七、原型的质量保障集成测试参考项目仓库用一组真实可构建的参考项目验证原型生成结果除 nettyclient 外还包括apachehttpclient/apachehttpclientwithoutnativeimageApache HttpClient 组合后者关闭原生镜像urlhttpclientJDK 内置 UrlConnection 客户端组合identitycenterIAM Identity Center 凭证组合额外生成sso/ssooidc依赖。每个项目都包含archetype.properties记录生成参数、goal.txt记录验证目标与reference/目录记录预期生成的全部文件含 README、pom.xml、源码与测试。这些参考文件即本文所引用文档的来源也表明你可以在仓库的 archetypes/archetype-app-quickstart/src/test/resources/projects/ 下看到不同参数组合各自会生成什么样的完整工程作为使用与二次定制原型的直接参照。八、快速上手总结使用archetype-app-quickstart生成工程时按提示依次填写/确认javaSdkVersion、service、httpClient、nativeImage、credentialProvider等属性生成后按 README 的目录结构在Handler.sendRequest()中编写 AWS API 调用逻辑客户端实例统一从DependencyFactory获取日常迭代执行mvn clean package生产环境需要毫秒级冷启动或低内存占用时安装 GraalVMnative-image后执行mvn clean package -P native-image并在target目录中直接运行生成的本地可执行文件。【免费下载链接】aws-sdk-java-v2The official AWS SDK for Java - Version 2项目地址: https://gitcode.com/GitHub_Trending/aw/aws-sdk-java-v2创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考