這是 AWS CDK v2 開發人員指南。較舊的 CDK v1 於 2022 年 6 月 1 日進入維護,並於 2023 年 6 月 1 日結束支援。
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在 Java AWS CDK 中使用
Java 是 完全支援的用戶端語言, AWS CDK 且被視為穩定。您可以使用熟悉的工具在 Java 中開發 AWS CDK 應用程式,包括 JDK(Oracle 或 OpenJDK 分佈,例如 Amazon Corretto) 和 Apache Maven。
AWS CDK 支援 Java 8 和更新版本。不過,我們建議您使用最新版本,因為較新版本的語言包含對開發 AWS CDK 應用程式特別方便的改進。例如,Java 9 引入 Map.of()
方法 (一種在 中宣告作為物件常值寫入之雜湊圖的便利方法 TypeScript)。Java 10 使用 var
關鍵字引入本機類型推論。
注意
本開發人員指南中的大多數程式碼範例都適用於 Java 8。幾個範例使用 Map.of()
;這些範例包含註解,指出他們需要 Java 9。
您可以使用任何文字編輯器或可讀取 Maven 專案IDE的 Java 來處理 AWS CDK 應用程式。我們在本指南中提供 Eclipse
可以使用 Java 以外的JVM託管語言撰寫 AWS CDK 應用程式 (例如 Kotlin、Groovy、Clojure 或 Scala),但體驗可能不特別特殊,而且我們無法為這些語言提供任何支援。
開始使用 Java
若要使用 AWS CDK,您必須擁有 AWS 帳戶和憑證,並已安裝 Node.js 和 AWS CDK Toolkit。請參閱 開始使用 AWS CDK。
Java AWS CDK 應用程式需要 Java 8 (v1.8) 或更新版本。我們建議使用 Amazon Corretto
注意
第三方語言棄用:只有在供應商或社群共用 EOL(生命週期結束) 之前,才支援語言版本,並且可能會在事先通知的情況下變更。
建立專案
您可以透過cdk init
在空目錄中叫用 來建立新的 AWS CDK 專案。使用 --language
選項並指定 java
:
mkdir my-project cd my-project cdk init app --language java
cdk init
使用專案資料夾的名稱來命名專案的各種元素,包括類別、子資料夾和檔案。資料夾名稱中的連字號會轉換為底線。但是,名稱應遵循 Java 識別符的形式;例如,名稱不應以數字開頭或包含空格。
產生的專案包含 software.amazon.awscdk
Maven 套件的參考。Maven 會自動安裝它及其相依性。
如果您使用的是 IDE,您現在可以開啟或匯入專案。例如,在 Eclipse 中,選擇檔案 > 匯入 > Maven > 現有 Maven 專案 。確定專案設定設定為使用 Java 8 (1.8)。
管理 AWS 建構程式庫模組
使用 Maven 安裝組 中的 AWS 建構程式庫套件software.amazon.awscdk
。大多數建構位於成品 中aws-cdk-lib
,預設會新增至新的 Java 專案。仍在開發更高層級CDK支援之服務的模組,採用個別的「實驗」套件,以服務名稱的短版本 (無 AWS 或 Amazon 字首) 命名。搜尋 Maven 中央儲存庫
注意
CDK API 參考的 Java 版本也會顯示套件名稱。
有些服務「 AWS 建構程式庫支援位於多個命名空間中。例如,Amazon Route 53 的功能分為 software.amazon.awscdk.route53
、route53-patterns
、 route53resolver
和 route53-targets
。
主 AWS CDK 套件會以 匯入 Java 程式碼software.amazon.awscdk
。 AWS Construct Library 中各種服務的模組位於 下software.amazon.awscdk.services
,且名稱與其 Maven 套件名稱類似。例如,Amazon S3 模組的命名空間為 software.amazon.awscdk.services.s3
。
我們建議您為每個 Java 來源檔案中使用的每個 AWS 建構程式庫類別撰寫單獨的 Java import
陳述式,並避免萬用字元匯入。您可以隨時使用類型的完整名稱 (包括其命名空間),而不需要import
陳述式。
如果您的應用程式依賴實驗套件,請編輯專案的 ,pom.xml
並在<dependencies>
容器中新增<dependency>
元素。例如,下列<dependency>
元素會指定 CodeStar 實驗建構程式庫模組:
<dependency> <groupId>software.amazon.awscdk</groupId> <artifactId>codestar-alpha</artifactId> <version>2.0.0-alpha.10</version> </dependency>
提示
如果您使用 Java IDE,它可能具有管理 Maven 相依性的功能。不過,除非您絕對確定 IDE的功能與您手動執行的功能相符,否則建議您pom.xml
直接編輯 。
在 中管理相依性 Java
在 Java 中,相依性是在 中指定pom.xml
,並使用 Maven 安裝。<dependencies>
容器包含每個套件的 <dependency>
元素。以下是pom.xml
典型 CDK Java 應用程式的 區段。
<dependencies> <dependency> <groupId>software.amazon.awscdk</groupId> <artifactId>aws-cdk-lib</artifactId> <version>2.14.0</version> </dependency> <dependency> <groupId>software.amazon.awscdk</groupId> <artifactId>appsync-alpha</artifactId> <version>2.10.0-alpha.0</version> </dependency> </dependencies>
提示
許多 Java IDEs都整合了 Maven 支援和視覺化pom.xml
編輯器,您可能會覺得這對於管理相依性很方便。
Maven 不支援相依性鎖定。雖然可以在 中指定版本範圍pom.xml
,但我們建議您一律使用確切的版本來保持建置可重複。
Maven 會自動安裝暫時性相依性,但每個套件只能有一個已安裝的副本。樹POM狀目錄中指定的最高版本已選取;應用程式一律在安裝的套件版本中具有最後一個字。
當您建置專案 (mvn compile) 或封裝 (mvn package) 時,Maven 會自動安裝或更新相依性。CDK 工具組會在每次執行工具時自動執行此操作,因此通常不需要手動叫用 Maven。
AWS CDK Java 中的慣用語
道具
所有 AWS 建構程式庫類別都會使用三個引數進行實例化:定義建構體的範圍 (其在建構樹中的父系)、id 和 props ,即建構體用來設定其建立之資源的鍵/值對套件。其他類別和方法也會使用「屬性組合」模式作為引數。
在 Java 中,props 使用 Builder 模式 Bucket
(代表 Amazon S3 儲存貯體) 會將其視為其道具 執行個體BucketProps
。
BucketProps
類別 (如同每個 AWS 建構程式庫道具類別) 具有稱為 的內部類別Builder
。BucketProps.Builder
類型提供設定BucketProps
執行個體各種屬性的方法。每個方法都會傳回Builder
執行個體,因此方法呼叫可以鏈結以設定多個屬性。在鏈結結束時,您呼叫 build()
以實際產生BucketProps
物件。
Bucket bucket = new Bucket(this, "amzn-s3-demo-bucket", new BucketProps.Builder() .versioned(true) .encryption(BucketEncryption.KMS_MANAGED) .build());
建構 和其他使用類似 props 的物件作為其最終引數的類別會提供捷徑。類別具有Builder
自己的 ,可在一個步驟中使它及其道具物件具現化。如此一來,您便不需要明確地實例化 (例如) BucketProps
和 Bucket
,而且不需要匯入 props 類型。
Bucket bucket = Bucket.Builder.create(this, "amzn-s3-demo-bucket") .versioned(true) .encryption(BucketEncryption.KMS_MANAGED) .build();
從現有的建構中取得自己的建構時,您可能想要接受其他屬性。我們建議您遵循這些建置器模式。不過,這不如將建構類別子分類那麼簡單。您必須自行提供兩個新Builder
類別的移動部分。您可能只希望您的建構接受一或多個其他引數。引數為選用時,您應該提供額外的建構器。
一般結構
在某些 中APIs, AWS CDK 會使用 JavaScript 陣列或未輸入的物件作為方法的輸入。(例如,請參閱 AWS CodeBuildBuildSpec.fromObject()
的方法。) 在 Java 中,這些物件會以 表示java.util.Map<String, Object>
。如果這些值都是字串,您可以使用 Map<String, String>
。
Java 不提供撰寫此類容器常值的方法,就像其他一些語言一樣。在 Java 9 和更新版本中,您可以使用 java.util.Map.of()
java.util.Map.of( "base-directory", "dist", "files", "LambdaStack.template.json" )
若要建立超過十個項目的地圖,請使用 java.util.Map.ofEntries()
如果您使用的是 Java 8,您可以提供自己的類似方法。
JavaScript 陣列在 Java List<String>
中以 List<Object>
或 表示。此方法可java.util.Arrays.asList
方便地定義短List
的 。
List<String> cmds = Arrays.asList("cd lambda", "npm install", "npm install typescript")
缺少值
在 Java 中,props 等 AWS CDK 物件中的遺失值由 表示null
。您必須明確測試任何值,null
以確保它包含值,然後再對它執行任何操作。Java 沒有「語法糖」來協助處理 Null 值,就像某些其他語言一樣。在某些情況下,您可能會發現 Apache ObjectUtil的 defaultIfNull
建置和執行CDK應用程式
在執行應用程式之前, AWS CDK 會自動編譯應用程式。不過,手動建置應用程式以檢查錯誤和執行測試可能很有用。您可以在 IDE(例如,在 Eclipse 中按下 Control-B) 或在專案根目錄中mvn compile
透過命令提示進行發出。
執行您在命令提示mvn test
中執行的任何測試。