Building Reusable "Cloud Components" / Constructs with AWS CDK, Java and Maven 📎
An AWS CDK construct encapsulates a reusable piece of cloud infrastructure. In our example it is the Amazon Elastic Container Registry :
import software.amazon.awscdk.services.ecr.Repository;
import software.constructs.Construct;
public class AirhacksECR extends Construct {
    private Repository repository;
    public AirhacksECR(Construct scope, String id, String repositoryName) {
        super(scope, id);
        this.repository = Repository.Builder.create(scope, id + "-ecr")
            .imageScanOnPush(true)
            .repositoryName("airhacks/" + repositoryName)
            .build();
    }
    
    public Repository getRepository() {
        return this.repository;
    }
}    
Such a construct can be compiled and deployed (mvn install) into a local or remote Maven repository, but requires the declaration of the following dependencies:
<dependency>
    <groupId>software.amazon.awscdk</groupId>
    <artifactId>aws-cdk-lib</artifactId>
    ...recent version
</dependency>
<dependency>
    <groupId>software.constructs</groupId>
    <artifactId>constructs</artifactId>
    ...recent version
</dependency>
Let's assume the construct's GAV coordinates are:
<groupId>airhacks</groupId>
<artifactId>ecr</artifactId>
<version>0.1</version>
After a successful compilation and deployment, the construct becomes available to other CDK projects via the following dependency:
<dependency>
    <groupId>airhacks</groupId>
    <artifactId>ecr</artifactId>
    <version>0.1</version>
</dependency>
Now an opinionated AWS ECR registry can be created via the AirhacksECR construct:
import software.constructs.Construct;
import airhacks.ecr.AirhacksECR;
import software.amazon.awscdk.Stack;
import software.amazon.awscdk.StackProps;
public class CDKStack extends Stack {
    public CDKStack(final Construct scope, final String id, final StackProps props) {
        super(scope, id, props);
        var ecr = new AirhacksECR(this, id, "live");
        var repository = ecr.getRepository();
    }
}
See it in action - deployment included:
The template: https://github.com/adambien/aws-cdk-plain was used in both projects.