You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 06:25:27