Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions examples/gazelle/src/test/com/example/gazelle/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,15 @@ diff_test(
file1 = ":generated_targets",
file2 = ":expected-query-output",
)

java_test_suite(
name = "gazelle",
srcs = ["ExampleTest.java"],
runner = "junit5",
runtime_deps = [
"@maven//:org_junit_jupiter_junit_jupiter_engine",
"@maven//:org_junit_platform_junit_platform_launcher",
"@maven//:org_junit_platform_junit_platform_reporting",
],
deps = ["@maven//:org_junit_jupiter_junit_jupiter_api"],
)
1 change: 1 addition & 0 deletions java/gazelle/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ go_test(
embed = [":gazelle"],
deps = [
"//java/gazelle/javaconfig",
"//java/gazelle/private/maven",
"//java/gazelle/private/sorted_set",
"//java/gazelle/private/types",
"@bazel_gazelle//config",
Expand Down
12 changes: 0 additions & 12 deletions java/gazelle/configure.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import (

"github.com/bazel-contrib/rules_jvm/java/gazelle/javaconfig"
"github.com/bazel-contrib/rules_jvm/java/gazelle/private/javaparser"
"github.com/bazel-contrib/rules_jvm/java/gazelle/private/maven"
"github.com/bazel-contrib/rules_jvm/java/gazelle/private/types"
"github.com/bazelbuild/bazel-gazelle/config"
"github.com/bazelbuild/bazel-gazelle/rule"
Expand Down Expand Up @@ -246,17 +245,6 @@ func (jc *Configurer) Configure(c *config.Config, rel string, f *rule.File) {
}
jc.lang.parser = runner
}

if jc.lang.mavenResolver == nil {
resolver, err := maven.NewResolver(
cfg.MavenInstallFile(),
jc.lang.logger,
)
if err != nil {
jc.lang.logger.Fatal().Err(err).Msg("error creating Maven resolver")
}
jc.lang.mavenResolver = resolver
}
}

type annotationToAttribute map[string]map[string]bzl.Expr
Expand Down
27 changes: 23 additions & 4 deletions java/gazelle/lang.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,10 @@ type javaLang struct {
language.BaseLifecycleManager
resolve.Resolver

parser *javaparser.Runner
logger zerolog.Logger
javaLogLevel string
mavenResolver maven.Resolver
parser *javaparser.Runner
logger zerolog.Logger
javaLogLevel string
mavenResolvers map[string]*maven.Resolver

// javaPackageCache is used for module granularity support
// Key is the path to the java package from the Bazel workspace root.
Expand Down Expand Up @@ -70,6 +70,7 @@ func NewLanguage() language.Language {
javaLogLevel: javaLevel,
javaPackageCache: make(map[string]*java.Package),
javaExportIndex: java_export_index.NewJavaExportIndex(languageName, logger),
mavenResolvers: make(map[string]*maven.Resolver),
}

l.logger = l.logger.Hook(shutdownServerOnFatalLogHook{
Expand Down Expand Up @@ -255,6 +256,24 @@ func (l javaLang) DoneGeneratingRules() {
l.javaExportIndex.FinalizeIndex()
}

func (l javaLang) MavenResolverForInstallFile(installFile string) (maven.Resolver, error) {
if resolver, exists := l.mavenResolvers[installFile]; exists {
return *resolver, nil
}

l.logger.Debug().Msgf("Create resolver for %s", installFile)
resolver, err := maven.NewResolver(
installFile,
l.logger,
)
if err != nil {
return nil, err
}

l.mavenResolvers[installFile] = &resolver
return resolver, nil
}

func (l javaLang) AfterResolvingDeps(_ context.Context) {
if l.hasHadErrors {
l.logger.Fatal().Msg("the java extension encountered errors that will create invalid build files")
Expand Down
32 changes: 18 additions & 14 deletions java/gazelle/resolve.go
Original file line number Diff line number Diff line change
Expand Up @@ -274,23 +274,27 @@ func (jr *Resolver) resolveSinglePackage(c *config.Config, pc *javaconfig.Config
return l
}

if l, err := jr.lang.mavenResolver.Resolve(imp, pc.ExcludedArtifacts(), pc.MavenRepositoryName()); err != nil {
var noExternal *maven.NoExternalImportsError
var multipleExternal *maven.MultipleExternalImportsError

if errors.As(err, &noExternal) {
// do not fail, the package might be provided elsewhere
} else if errors.As(err, &multipleExternal) {
jr.lang.logger.Error().Msg("Append one of the following to BUILD.bazel:")
for _, possible := range multipleExternal.PossiblePackages {
jr.lang.logger.Error().Msgf("# gazelle:resolve java %s %s", imp.Name, possible)
if mavenResolver, err := jr.lang.MavenResolverForInstallFile(pc.MavenInstallFile()); err != nil {
jr.lang.logger.Fatal().Err(err).Msg("error creating Maven resolver")
} else {
if l, err := mavenResolver.Resolve(imp, pc.ExcludedArtifacts(), pc.MavenRepositoryName()); err != nil {
var noExternal *maven.NoExternalImportsError
var multipleExternal *maven.MultipleExternalImportsError

if errors.As(err, &noExternal) {
// do not fail, the package might be provided elsewhere
} else if errors.As(err, &multipleExternal) {
jr.lang.logger.Error().Msg("Append one of the following to BUILD.bazel:")
for _, possible := range multipleExternal.PossiblePackages {
jr.lang.logger.Error().Msgf("# gazelle:resolve java %s %s", imp.Name, possible)
}
jr.lang.hasHadErrors = true
} else {
jr.lang.logger.Fatal().Err(err).Msg("maven resolver error")
}
jr.lang.hasHadErrors = true
} else {
jr.lang.logger.Fatal().Err(err).Msg("maven resolver error")
return l
}
} else {
return l
}

if isTestRule {
Expand Down
9 changes: 7 additions & 2 deletions java/gazelle/resolve_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"strings"
"testing"

"github.com/bazel-contrib/rules_jvm/java/gazelle/private/maven"
"github.com/bazel-contrib/rules_jvm/java/gazelle/private/sorted_set"
"github.com/bazel-contrib/rules_jvm/java/gazelle/private/types"
"github.com/bazelbuild/bazel-gazelle/config"
Expand Down Expand Up @@ -353,7 +354,9 @@ func testConfig(t *testing.T, args ...string) (*config.Config, []language.Langua
}

l := NewLanguage()
l.(*javaLang).mavenResolver = &testResolver{}
// Create a wrapper that implements maven.Resolver interface
var resolver maven.Resolver = NewTestMavenResolver()
l.(*javaLang).mavenResolvers["maven_install.json"] = &resolver

langs := []language.Language{
proto.NewLanguage(),
Expand Down Expand Up @@ -393,7 +396,9 @@ func InitTestResolversAndExtensions(langs []language.Language) (mapResolver, []i
for _, lang := range langs {
// TODO There has to be a better way to make this generic.
if jLang, ok := lang.(*javaLang); ok {
jLang.mavenResolver = NewTestMavenResolver()
// Create a wrapper that implements maven.Resolver interface
var resolver maven.Resolver = NewTestMavenResolver()
jLang.mavenResolvers["maven_install.json"] = &resolver
jLang.javaExportIndex.FinalizeIndex()
}

Expand Down
1 change: 1 addition & 0 deletions java/gazelle/testdata/maven_with_invalid_resolver/BUILD.in
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# gazelle:java_maven_repository_name vendor_java
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# gazelle:java_maven_repository_name vendor_java
3 changes: 3 additions & 0 deletions java/gazelle/testdata/maven_with_invalid_resolver/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Invalid Maven JSON file

The extension exits with 1 when it is unable to parse the maven_install.json file.
28 changes: 28 additions & 0 deletions java/gazelle/testdata/maven_with_invalid_resolver/WORKSPACE
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

http_archive(
name = "rules_jvm_external",
sha256 = "23fe83890a77ac1a3ee143e2306ec12da4a845285b14ea13cb0df1b1e23658fe",
strip_prefix = "rules_jvm_external-4.3",
urls = ["https://github.com/bazelbuild/rules_jvm_external/archive/refs/tags/4.3.tar.gz"],
)

load("@rules_jvm_external//:defs.bzl", "maven_install")

maven_install(
name = "vendor_java",
artifacts = [
"junit:junit:4.13.1",
"com.google.guava:guava:30.0-jre",
],
fetch_sources = True,
maven_install_json = "//:maven_install.json",
repositories = [
"http://uk.maven.org/maven2",
"https://jcenter.bintray.com/",
],
)

load("@maven//:defs.bzl", "pinned_maven_install")

pinned_maven_install()
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
1
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"level":"fatal","error":"failed to parse coordinate <nil>: invalid Maven coordinate \"invalid_dependency\" - needed at least 2 :s","message":"error creating Maven resolver"}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"dependency_tree": {
"dependencies": [
{
"coord": "invalid_dependency"
}
],
"version": "0.1.0"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.example.myproject;

import com.google.common.primitives.Ints;

/** This application compares two numbers, using the Ints.compare method from Guava. */
public class App {

public static int compare(int a, int b) {
return Ints.compare(a, b);
}

public static void main(String... args) throws Exception {
App app = new App();
System.out.println("Success: " + app.compare(2, 1));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# gazelle:java_maven_repository_name vendor_java
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# gazelle:java_maven_repository_name vendor_java
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Copied from
[bazelbuild/examples/java-maven](https://github.com/bazelbuild/examples/tree/b29794fb55f6714442dd86946c77f8908321a430/java-maven).
41 changes: 41 additions & 0 deletions java/gazelle/testdata/maven_with_multiple_repositories/WORKSPACE
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

http_archive(
name = "rules_jvm_external",
sha256 = "23fe83890a77ac1a3ee143e2306ec12da4a845285b14ea13cb0df1b1e23658fe",
strip_prefix = "rules_jvm_external-4.3",
urls = ["https://github.com/bazelbuild/rules_jvm_external/archive/refs/tags/4.3.tar.gz"],
)

load("@rules_jvm_external//:defs.bzl", "maven_install")

maven_install(
name = "vendor_java",
artifacts = [
"com.google.guava:guava:30.0-jre",
],
fetch_sources = True,
maven_install_json = "//:maven_install.json",
repositories = [
"http://uk.maven.org/maven2",
"https://jcenter.bintray.com/",
],
)

maven_install(
name = "junit_java",
artifacts = [
"junit:junit:4.13.1",
"com.google.guava:guava:30.0-jre",
],
fetch_sources = True,
maven_install_json = "//:maven_install.junit.json",
repositories = [
"http://uk.maven.org/maven2",
"https://jcenter.bintray.com/",
],
)

load("@maven//:defs.bzl", "pinned_maven_install")

pinned_maven_install()
Loading
Loading