Skip to content

Cant't load more then 1 module in Java #2073

Open
@benkeil

Description

@benkeil

Community Note

  • Please vote on this issue by adding a 👍 reaction to the original issue to help the community and maintainers prioritize this request
  • Please do not leave "+1" or other comments that do not add relevant new information or questions, they generate extra noise for issue followers and do not help prioritize the request
  • If you are interested in working on this issue or have submitted a pull request, please leave a comment

cdktf & Language Versions

com.hashicorp:cdktf:0.12.1
software.constructs:constructs:10.1.79
com.hashicorp:cdktf-provider-aws:9.0.15
com.hashicorp:cdktf-provider-vault:2.0.34

terraform version
Terraform v1.2.8
on darwin_arm64

cdktf --version
0.12.1

Affected Resource(s)

Can't load more then 1 module with cdktf java

Debug Output

java.lang.reflect.InvocationTargetException
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
	at kotlin.reflect.jvm.internal.calls.CallerImpl$Constructor.call(CallerImpl.kt:41)
	at kotlin.reflect.jvm.internal.KCallableImpl.call(KCallableImpl.kt:108)
	at io.kotest.engine.spec.InstantiateSpecKt.javaReflectNewInstance(instantiateSpec.kt:51)
	at io.kotest.engine.spec.InstantiateSpecKt.createAndInitializeSpec(instantiateSpec.kt:30)
	at io.kotest.engine.spec.InstantiateSpecKt.instantiate(instantiateSpec.kt:11)
	at io.kotest.engine.spec.SpecRefKt.instance(SpecRef.kt:14)
	at io.kotest.engine.spec.SpecExecutor.createInstance-gIAlu-s(SpecExecutor.kt:127)
	at io.kotest.engine.spec.SpecExecutor.access$createInstance-gIAlu-s(SpecExecutor.kt:48)
	at io.kotest.engine.spec.SpecExecutor$referenceInterceptors$innerExecute$1.invokeSuspend(SpecExecutor.kt:85)
	at io.kotest.engine.spec.SpecExecutor$referenceInterceptors$innerExecute$1.invoke(SpecExecutor.kt)
	at io.kotest.engine.spec.SpecExecutor$referenceInterceptors$innerExecute$1.invoke(SpecExecutor.kt)
	at io.kotest.engine.spec.interceptor.FinalizeSpecInterceptor.intercept-0E7RQCE(FinalizeSpecInterceptor.kt:19)
	at io.kotest.engine.spec.SpecExecutor$referenceInterceptors$3$1.invokeSuspend(SpecExecutor.kt:90)
	at io.kotest.engine.spec.SpecExecutor$referenceInterceptors$3$1.invoke(SpecExecutor.kt)
	at io.kotest.engine.spec.SpecExecutor$referenceInterceptors$3$1.invoke(SpecExecutor.kt)
	at io.kotest.engine.spec.interceptor.PrepareSpecInterceptor.intercept-0E7RQCE(PrepareSpecInterceptor.kt:20)
	at io.kotest.engine.spec.SpecExecutor$referenceInterceptors$3$1.invokeSuspend(SpecExecutor.kt:90)
	at io.kotest.engine.spec.SpecExecutor$referenceInterceptors$3$1.invoke(SpecExecutor.kt)
	at io.kotest.engine.spec.SpecExecutor$referenceInterceptors$3$1.invoke(SpecExecutor.kt)
	at io.kotest.engine.spec.interceptor.ApplyExtensionsInterceptor.intercept-0E7RQCE(ApplyExtensionsInterceptor.kt:35)
	at io.kotest.engine.spec.SpecExecutor$referenceInterceptors$3$1.invokeSuspend(SpecExecutor.kt:90)
	at io.kotest.engine.spec.SpecExecutor$referenceInterceptors$3$1.invoke(SpecExecutor.kt)
	at io.kotest.engine.spec.SpecExecutor$referenceInterceptors$3$1.invoke(SpecExecutor.kt)
	at io.kotest.engine.spec.interceptor.SpecFinishedInterceptor.intercept-0E7RQCE(SpecFinishedInterceptor.kt:21)
	at io.kotest.engine.spec.SpecExecutor$referenceInterceptors$3$1.invokeSuspend(SpecExecutor.kt:90)
	at io.kotest.engine.spec.SpecExecutor$referenceInterceptors$3$1.invoke(SpecExecutor.kt)
	at io.kotest.engine.spec.SpecExecutor$referenceInterceptors$3$1.invoke(SpecExecutor.kt)
	at io.kotest.engine.spec.interceptor.SpecStartedInterceptor.intercept-0E7RQCE(SpecStartedInterceptor.kt:19)
	at io.kotest.engine.spec.SpecExecutor$referenceInterceptors$3$1.invokeSuspend(SpecExecutor.kt:90)
	at io.kotest.engine.spec.SpecExecutor$referenceInterceptors$3$1.invoke(SpecExecutor.kt)
	at io.kotest.engine.spec.SpecExecutor$referenceInterceptors$3$1.invoke(SpecExecutor.kt)
	at io.kotest.engine.spec.interceptor.SpecRefExtensionInterceptor$intercept$inner$1.invokeSuspend(SpecRefExtensionInterceptor.kt:27)
	at io.kotest.engine.spec.interceptor.SpecRefExtensionInterceptor$intercept$inner$1.invoke(SpecRefExtensionInterceptor.kt)
	at io.kotest.engine.spec.interceptor.SpecRefExtensionInterceptor$intercept$inner$1.invoke(SpecRefExtensionInterceptor.kt)
	at io.kotest.engine.spec.interceptor.SpecRefExtensionInterceptor.intercept-0E7RQCE(SpecRefExtensionInterceptor.kt:30)
	at io.kotest.engine.spec.SpecExecutor$referenceInterceptors$3$1.invokeSuspend(SpecExecutor.kt:90)
	at io.kotest.engine.spec.SpecExecutor$referenceInterceptors$3$1.invoke(SpecExecutor.kt)
	at io.kotest.engine.spec.SpecExecutor$referenceInterceptors$3$1.invoke(SpecExecutor.kt)
	at io.kotest.engine.spec.interceptor.RequiresTagSpecInterceptor.intercept-0E7RQCE(RequiresTagSpecInterceptor.kt:35)
	at io.kotest.engine.spec.SpecExecutor$referenceInterceptors$3$1.invokeSuspend(SpecExecutor.kt:90)
	at io.kotest.engine.spec.SpecExecutor$referenceInterceptors$3$1.invoke(SpecExecutor.kt)
	at io.kotest.engine.spec.SpecExecutor$referenceInterceptors$3$1.invoke(SpecExecutor.kt)
	at io.kotest.engine.spec.interceptor.TagsExcludedSpecInterceptor.intercept-0E7RQCE(TagsExcludedDiscoveryExtension.kt:32)
	at io.kotest.engine.spec.SpecExecutor$referenceInterceptors$3$1.invokeSuspend(SpecExecutor.kt:90)
	at io.kotest.engine.spec.SpecExecutor$referenceInterceptors$3$1.invoke(SpecExecutor.kt)
	at io.kotest.engine.spec.SpecExecutor$referenceInterceptors$3$1.invoke(SpecExecutor.kt)
	at io.kotest.engine.spec.interceptor.SystemPropertySpecFilterInterceptor.intercept-0E7RQCE(SystemPropertySpecFilterInterceptor.kt:49)
	at io.kotest.engine.spec.SpecExecutor$referenceInterceptors$3$1.invokeSuspend(SpecExecutor.kt:90)
	at io.kotest.engine.spec.SpecExecutor$referenceInterceptors$3$1.invoke(SpecExecutor.kt)
	at io.kotest.engine.spec.SpecExecutor$referenceInterceptors$3$1.invoke(SpecExecutor.kt)
	at io.kotest.engine.spec.interceptor.SpecFilterInterceptor.intercept-0E7RQCE(SpecFilterInterceptor.kt:37)
	at io.kotest.engine.spec.SpecExecutor$referenceInterceptors$3$1.invokeSuspend(SpecExecutor.kt:90)
	at io.kotest.engine.spec.SpecExecutor$referenceInterceptors$3$1.invoke(SpecExecutor.kt)
	at io.kotest.engine.spec.SpecExecutor$referenceInterceptors$3$1.invoke(SpecExecutor.kt)
	at io.kotest.engine.spec.interceptor.IgnoredSpecInterceptor.intercept-0E7RQCE(IgnoredSpecInterceptor.kt:52)
	at io.kotest.engine.spec.SpecExecutor$referenceInterceptors$3$1.invokeSuspend(SpecExecutor.kt:90)
	at io.kotest.engine.spec.SpecExecutor$referenceInterceptors$3$1.invoke(SpecExecutor.kt)
	at io.kotest.engine.spec.SpecExecutor$referenceInterceptors$3$1.invoke(SpecExecutor.kt)
	at io.kotest.engine.spec.interceptor.EnabledIfSpecInterceptor.intercept-0E7RQCE(EnabledIfSpecInterceptor.kt:40)
	at io.kotest.engine.spec.SpecExecutor$referenceInterceptors$3$1.invokeSuspend(SpecExecutor.kt:90)
	at io.kotest.engine.spec.SpecExecutor$referenceInterceptors$3$1.invoke(SpecExecutor.kt)
	at io.kotest.engine.spec.SpecExecutor$referenceInterceptors$3$1.invoke(SpecExecutor.kt)
	at io.kotest.engine.spec.SpecExecutor.referenceInterceptors(SpecExecutor.kt:91)
	at io.kotest.engine.spec.SpecExecutor.execute(SpecExecutor.kt:60)
	at io.kotest.engine.ConcurrentTestSuiteScheduler$schedule$8$1$2.invokeSuspend(ConcurrentTestSuiteScheduler.kt:71)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
	at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:284)
	at kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:85)
	at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Builders.kt:59)
	at kotlinx.coroutines.BuildersKt.runBlocking(Unknown Source)
	at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(Builders.kt:38)
	at kotlinx.coroutines.BuildersKt.runBlocking$default(Unknown Source)
	at io.kotest.common.RunBlockingKt.runBlocking(runBlocking.kt:3)
	at io.kotest.engine.TestEngineLauncher.launch(TestEngineLauncher.kt:194)
	at io.kotest.runner.junit.platform.KotestJunitPlatformTestEngine.execute(KotestJunitPlatformTestEngine.kt:82)
	at io.kotest.runner.junit.platform.KotestJunitPlatformTestEngine.execute(KotestJunitPlatformTestEngine.kt:46)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75)
	at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:99)
	at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:79)
	at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:75)
	at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:61)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
	at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33)
	at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
	at jdk.proxy1/jdk.proxy1.$Proxy2.stop(Unknown Source)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:193)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:129)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:100)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:60)
	at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56)
	at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:133)
	at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71)
	at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69)
	at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74)
Caused by: software.amazon.jsii.JsiiException: Module 'terraform-aws-modules_s3-bucket_aws' not found
Error: Module 'terraform-aws-modules_s3-bucket_aws' not found
    at exports.Kernel._typeInfoForFqn (/private/var/folders/c9/_w7dcm_1539b_fwzc6zs7gf40000gq/T/jsii-java-runtime7564311983626734599/lib/program.js:5359:38)
    at exports.Kernel._findCtor (/private/var/folders/c9/_w7dcm_1539b_fwzc6zs7gf40000gq/T/jsii-java-runtime7564311983626734599/lib/program.js:5156:39)
    at exports.Kernel._create (/private/var/folders/c9/_w7dcm_1539b_fwzc6zs7gf40000gq/T/jsii-java-runtime7564311983626734599/lib/program.js:5181:144)
    at exports.Kernel.create (/private/var/folders/c9/_w7dcm_1539b_fwzc6zs7gf40000gq/T/jsii-java-runtime7564311983626734599/lib/program.js:4989:29)
    at exports.KernelHost.processRequest (/private/var/folders/c9/_w7dcm_1539b_fwzc6zs7gf40000gq/T/jsii-java-runtime7564311983626734599/lib/program.js:6083:36)
    at exports.KernelHost.run (/private/var/folders/c9/_w7dcm_1539b_fwzc6zs7gf40000gq/T/jsii-java-runtime7564311983626734599/lib/program.js:6057:48)
    at Immediate._onImmediate (/private/var/folders/c9/_w7dcm_1539b_fwzc6zs7gf40000gq/T/jsii-java-runtime7564311983626734599/lib/program.js:6058:46)
    at processImmediate (node:internal/timers:466:21)
	at software.amazon.jsii.JsiiRuntime.processErrorResponse(JsiiRuntime.java:124)
	at software.amazon.jsii.JsiiRuntime.requestResponse(JsiiRuntime.java:95)
	at software.amazon.jsii.JsiiClient.createObject(JsiiClient.java:89)
	at software.amazon.jsii.JsiiEngine.createNewObject(JsiiEngine.java:603)
	at imports.terraform_aws_modules.aws.S3Bucket.<init>(S3Bucket.java:17)
	at imports.terraform_aws_modules.aws.S3Bucket$Builder.build(S3Bucket.java:849)
	at de.otto.di.KotlinLambdaBuilderTest$1$stack$1.invoke(KotlinLambdaBuilderTest.kt:26)
	at de.otto.di.KotlinLambdaBuilderTest$1$stack$1.invoke(KotlinLambdaBuilderTest.kt:22)
	at de.otto.di.core.TerraformStackKt.<init>(TerraformStackKt.kt:8)
	at de.otto.di.KotlinLambdaBuilderTest$1.invoke(KotlinLambdaBuilderTest.kt:23)
	at de.otto.di.KotlinLambdaBuilderTest$1.invoke(KotlinLambdaBuilderTest.kt:20)
	at io.kotest.core.spec.style.FunSpec.<init>(funSpec.kt:25)
	at de.otto.di.KotlinLambdaBuilderTest.<init>(KotlinLambdaBuilderTest.kt:20)
	... 111 more

cdktf.json

{
  "language": "java",
  "app": "./gradlew run",
  "projectId": "cde4307b-d5d5-453d-a811-e51775ecc7d0",
  "sendCrashReports": "false",
  "codeMakerOutput": "src/main/java/imports",
  "terraformProviders": [],
  "terraformModules": [
    "terraform-aws-modules/lambda/aws",
    "terraform-aws-modules/s3-bucket/aws"
  ],
  "context": {
    "excludeStackIdFromLogicalIds": "false",
    "allowSepCharsInLogicalIds": "true"
  }
}

Everything gets downloaded, but the $Modul.java seems to be wrong.

content of src/main/java/imports/terraform_aws_modules/aws/

$Module.java
Lambda.java
LambdaOptions.java
S3Bucket.java
S3BucketOptions.java

content of src/main/java/imports/terraform_aws_modules/aws/$Module.java

package imports.terraform_aws_modules.aws;

import static java.util.Arrays.asList;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.Reader;
import java.io.UncheckedIOException;

import java.nio.charset.StandardCharsets;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import software.amazon.jsii.JsiiModule;

@software.amazon.jsii.Internal
public final class $Module extends JsiiModule {
    private static final Map<String, String> MODULE_TYPES = load();

    private static Map<String, String> load() {
        final Map<String, String> result = new HashMap<>();
        final ClassLoader cl = $Module.class.getClassLoader();
        try (final InputStream is = cl.getResourceAsStream("imports/terraform_aws_modules/aws/$Module.txt");
             final Reader rd = new InputStreamReader(is, StandardCharsets.UTF_8);
             final BufferedReader br = new BufferedReader(rd)) {
            br.lines()
              .filter(line -> !line.trim().isEmpty())
              .forEach(line ->  {
                final String[] parts = line.split("=", 2);
                final String fqn = parts[0];
                final String className = parts[1];
                result.put(fqn, className);
            });
        }
        catch (final IOException exception) {
            throw new UncheckedIOException(exception);
        }
        return result;
    }

    private final Map<String, Class<?>> cache = new HashMap<>();

    public $Module() {
        super("terraform-aws-modules_lambda_aws", "0.0.0", $Module.class, "[email protected]");
    }

    @Override
    public List<Class<? extends JsiiModule>> getDependencies() {
        return asList(com.hashicorp.cdktf.$Module.class, software.constructs.$Module.class);
    }

    @Override
    protected Class<?> resolveClass(final String fqn) throws ClassNotFoundException {
        if (!MODULE_TYPES.containsKey(fqn)) {
            throw new ClassNotFoundException("Unknown JSII type: " + fqn);
        }
        String className = MODULE_TYPES.get(fqn);
        if (!this.cache.containsKey(className)) {
            this.cache.put(className, this.findClass(className));
        }
        return this.cache.get(className);
    }

    private Class<?> findClass(final String binaryName) {
        try {
            return Class.forName(binaryName);
        }
        catch (final ClassNotFoundException exception) {
            throw new RuntimeException(exception);
        }
    }
}

content of src/main/resources/imports/terraform_aws_modules/aws/

content of src/main/resources/imports/terraform_aws_modules/aws/$Module.txt

terraform-aws-modules_lambda_aws.Lambda=imports.terraform_aws_modules.aws.Lambda
terraform-aws-modules_lambda_aws.LambdaOptions=imports.terraform_aws_modules.aws.LambdaOptions

Expected Behavior

Should synthesize the stack

Actual Behavior

Exception

Steps to Reproduce

  1. cdktf init --template=java
  2. Add 2 modules, e.g. terraform-aws-modules/lambda/aws and terraform-aws-modules/s3-bucket/aws
  3. Add one resource of each type2.
  4. synthesise the app

Important Factoids

I let it run with Kolin, but I also tried a plain java project and java the same error.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingbug/has-workaroundA bug with a workaround (may not be elegant)help wantedCommunity contributions welcome as the core team is unlikely to work on this soonmodulespriority/backlogLow priority (though possibly still important). Unlikely to be worked on within the next 6 months.provider get / generationsize/smallestimated < 1 day

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions