Skip to content
Prev Previous commit
Next Next commit
Java: pass a package namespace downstream
Reviewed `crd2pulumi/pkg/codegen/java.go` and `pulumi-java` codegen sources.

Found in `pulumi-java` `GeneratePackage` path: `generateModuleContextMap` sets `BasePackage` to
"com." + sanitizeImport(p.Namespace()) + "." when `BasePackage` is empty and `pkg.Namespace` is non-empty.
Since `crd2pulumi` sets `pkg.Namespace` to "com.pulumiverse", pulumi-java prepends its own "com." producing
"com.com.pulumiverse" → double com in output paths. Fix is to explicitly set the Java PackageInfo
BasePackage to the provided PackageNamespace so the pulumi-java defaulting logic doesn’t add an extra "com.".
  • Loading branch information
ringods committed Oct 17, 2025
commit 222324244fc46302af9914371c9ec0a190a3cc41
21 changes: 17 additions & 4 deletions pkg/codegen/java.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import (
"bytes"
"fmt"
"regexp"
"strings"

"github.com/pulumi/crd2pulumi/internal/versions"
javaGen "github.com/pulumi/pulumi-java/pkg/codegen/java"
Expand Down Expand Up @@ -48,6 +49,18 @@ func GenerateJava(pg *PackageGenerator, cs *CodegenSettings) (map[string]*bytes.
langName := "java"
oldName := pkg.Name
pkg.Name = cs.PackageName
pkg.Namespace = cs.PackageNamespace

// Override Java base package to avoid pulumi-java defaulting logic adding an extra "com." prefix
if pkg.Language == nil {
pkg.Language = map[string]interface{}{}
}
pkg.Language[langName] = javaGen.PackageInfo{BasePackage: cs.PackageNamespace}

namespacePath := "com/pulumi"
if cs.PackageNamespace != "" {
namespacePath = strings.ReplaceAll(cs.PackageNamespace, ".", "/")
}

files, err := javaGen.GeneratePackage("crd2pulumi", pkg, nil, nil, true, false)
if err != nil {
Expand All @@ -58,19 +71,19 @@ func GenerateJava(pg *PackageGenerator, cs *CodegenSettings) (map[string]*bytes.
delete(pkg.Language, langName)

// Pin the kubernetes provider version used
utilsPath := "src/main/java/com/pulumi/" + cs.PackageName + "/Utilities.java"
utilsPath := "src/main/java/" + namespacePath + "/" + cs.PackageName + "/Utilities.java"
utils, ok := files[utilsPath]
if !ok {
return nil, fmt.Errorf("cannot find generated utilities.ts")
return nil, fmt.Errorf("cannot find generated Utilities.java at path: %s", utilsPath)
}
re := regexp.MustCompile(`static \{(?:[^{}]|{[^{}]*})*}`)
files[utilsPath] = []byte(re.ReplaceAllString(string(utils), `static {
version = "4.9.0";
}`))

var unneededJavaFiles = []string{
"src/main/java/com/pulumi/" + cs.PackageName + "/Provider.java",
"src/main/java/com/pulumi/" + cs.PackageName + "/ProviderArgs.java",
"src/main/java/" + namespacePath + "/" + cs.PackageName + "/Provider.java",
"src/main/java/" + namespacePath + "/" + cs.PackageName + "/ProviderArgs.java",
"src/main/java/com/pulumi/kubernetes/meta/v1/inputs/ObjectMetaArgs.java",
"src/main/java/com/pulumi/kubernetes/meta/v1/outputs/ObjectMeta.java",
}
Expand Down
Loading