From 69234e4cd42b04ad5a893a77ad57ce9c71d0bba8 Mon Sep 17 00:00:00 2001 From: runchen0919 Date: Tue, 31 Mar 2026 16:46:50 +0800 Subject: [PATCH] fix: propagate transitive compile deps for non-project jar dependencies When a direct dependency resolves as jars (not an Eclipse project), Eclipse's project-level export mechanism cannot propagate the dependency's own compile-time deps. This causes ECJ to fail resolving types in the dependency's public API (e.g., SpecificRecord for Avro-generated classes). Load the dependency's EXPLICIT jdeps entries and add them as discouraged compile entries so ECJ can resolve the full type chain. --- .../discovery/JavaAspectsClasspathInfo.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/bundles/com.salesforce.bazel.eclipse.core/src/com/salesforce/bazel/eclipse/core/model/discovery/JavaAspectsClasspathInfo.java b/bundles/com.salesforce.bazel.eclipse.core/src/com/salesforce/bazel/eclipse/core/model/discovery/JavaAspectsClasspathInfo.java index 6c166b96..4cdd61d0 100644 --- a/bundles/com.salesforce.bazel.eclipse.core/src/com/salesforce/bazel/eclipse/core/model/discovery/JavaAspectsClasspathInfo.java +++ b/bundles/com.salesforce.bazel.eclipse.core/src/com/salesforce/bazel/eclipse/core/model/discovery/JavaAspectsClasspathInfo.java @@ -612,6 +612,34 @@ protected Collection resolveDependency(TargetKey targetKey) thro jarEntry.setExported(exported); result.add(jarEntry); } + + // When a dependency is resolved as jars (not a project), Eclipse's project-level + // export mechanism cannot propagate the dependency's own compile-time deps. + // Load the dependency's EXPLICIT jdeps entries and add them so that ECJ can resolve + // types in the dependency's public API (e.g., parent classes like SpecificRecord + // for Avro-generated classes). + var depInfo = aspectsInfo.get(targetKey); + if (depInfo != null) { + var depJdeps = loadJdeps(depInfo); + for (JdepsDependency jdep : depJdeps) { + if (jdep.dependencyKind() == Kind.EXPLICIT) { + var library = aspectsInfo.getLibraryByJdepsRootRelativePath( + jdep.artifactLocation().getRelativePath()); + if (library != null) { + var jarEntry = resolveJar(library.libraryArtifact); + if ((jarEntry != null) && validateEntry(jarEntry)) { + jarEntry.getAccessRules() + .add( + new AccessRule( + PATTERN_EVERYTHING, + IAccessRule.K_DISCOURAGED | IAccessRule.IGNORE_IF_BETTER)); + result.add(jarEntry); + } + } + } + } + } + return result; }