Terraform CDK Java程序运行报错:NoClassDefFoundError: software/constructs/Construct
Terraform CDK Java 执行
java -jar 报错:NoClassDefFoundError: software/constructs/Construct 我是Terraform CDK新手,写了创建EC2实例的简单代码,没有直接在终端执行cdktf deploy,而是在Main方法里用Java ProcessBuilder调用。代码编译和Jar构建都成功,但执行java -jar target/irm-1.0-SNAPSHOT.jar时,出现无法初始化主类的错误,根源是java.lang.NoClassDefFoundError: software/constructs/Construct。
错误信息
└─[$] java -jar target/irm-1.0-SNAPSHOT.jar [0:24:43] Error: Unable to initialize main class com.example.test.Main Caused by: java.lang.NoClassDefFoundError: software/constructs/Construct
项目文件结构

代码示例
Main.java
package com.example.test; import com.hashicorp.cdktf.App; import com.hashicorp.cdktf.TerraformStack; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) throws IOException { final App app = new App(); TerraformStack stack = new MainStack(app, "aws_instance"); // new RemoteBackend(stack, RemoteBackendProps.builder() // .hostname("app.terraform.io") // .organization("<YOUR_ORG>") // .workspaces(new NamedRemoteWorkspace("learn-cdktf")) // .build()); app.synth(); //calling cdktf deploy List<String> list = new ArrayList<String>(); list.add("/usr/local/bin/cdktf"); list.add("deploy"); // create the process ProcessBuilder build = new ProcessBuilder(list); // starting the process Process process = build.start(); // for reading the output from stream BufferedReader stdInput = new BufferedReader(new InputStreamReader( process.getInputStream())); String s = null; while ((s = stdInput.readLine()) != null) { System.out.println(s); } } }
MainStack.java
package com.example.test; import software.constructs.Construct; import com.hashicorp.cdktf.TerraformStack; import com.hashicorp.cdktf.TerraformOutput; import com.hashicorp.cdktf.providers.aws.AwsProvider; import com.hashicorp.cdktf.providers.aws.ec2.Instance; public class MainStack extends TerraformStack { public MainStack(final Construct scope, final String id) { super(scope, id); AwsProvider.Builder.create(this, "AWS") .region("ap-south-1") .build(); Instance instance = Instance.Builder.create(this, "compute") .ami("ami-0e18b1d379af4e263") .instanceType("t3a.micro") .build(); TerraformOutput.Builder.create(this, "public_ip") .value(instance.getPublicIp()) .build(); } }
解决方法
这个错误是因为默认生成的Jar包只包含你的代码,没有打包Terraform CDK、constructs等依赖类。Java标准打包工具不会自动包含依赖,需要用专门的插件生成包含所有依赖的可执行Jar。
1. Maven项目:使用Shade插件
在pom.xml中添加Shade插件配置,打包时合并所有依赖到一个Jar:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.example.test.Main</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build>
执行mvn clean package后,再运行生成的Jar即可。
2. Gradle项目:使用Shadow插件
在build.gradle中添加Shadow插件:
plugins { id 'java' id 'com.github.johnrengelman.shadow' version '7.1.2' } shadowJar { mergeServiceFiles() manifest { attributes 'Main-Class': 'com.example.test.Main' } }
执行gradle shadowJar,生成的Jar在build/libs/目录下,运行该Jar即可。
3. 额外检查
- 确认Maven/Gradle的依赖配置中已经正确引入
software.constructs:constructs、com.hashicorp:cdktf及AWS provider相关依赖。 - 检查依赖版本是否匹配,避免版本冲突导致类加载失败。
内容的提问来源于stack exchange,提问作者Raghav Patel
相关产品推荐
相关产品推荐

