GithubHelp home page GithubHelp logo

jjohannes / missing-metadata-guava Goto Github PK

View Code? Open in Web Editor NEW
11.0 3.0 1.0 126 KB

A Gradle plugin that provides additional metadata for Guava versions that were not published with Gradle Module Metadata.

License: Apache License 2.0

Kotlin 3.94% Groovy 64.25% Java 31.81%
gradle-plugin guava

missing-metadata-guava's Introduction

⚠️ The functionality of this plugin has been integrated into 'org.gradlex.java-ecosystem-capabilities'
Preferably use the org.gradlex.java-ecosystem-capabilities plugin in your build.

A Gradle plugin that adds additional metadata to all releases of the Google Guava library.

For more background, have a look at this blog post.

How to use the plugin

Add this plugin dependency to the build file of your convention plugin build (e.g. build-logic/build.gradle(.kts) or buildSrc/build.gradle(.kts)).

dependencies {
    implementation("de.jjohannes.gradle:missing-metadata-guava:31.1.1")
}

Apply the plugin in a convention plugin you use in all your Java/Android/JVM Gradle (sub)projects:

plugins {
  id("de.jjohannes.missing-metadata-guava")
}

There is no further configuration required.

Supported Guava releases

The latest release of this plugin can deal with all Guava releases up to 31.1.

Effect of the plugin

The plugin adds a Component Metadata Rule and a Capability Conflict Resolution Strategy to automatically resolve conflicts between different variants and versions of Guava. Have a look at this blog post for what these conflicts are and why they may not be resolved correctly if this plugin is not used.

Making sure the plugin works

To verify that this plugin has the desired effect, you may want to check which Jars end up on your compile or runtime classpath. Note that the dependency report alone can be a bit confusing, as it shows the Guava "version strings" that contain the suffix "-jre" or "-android". With this plugin however, the selected version is independent of the actual Guava variant (jar) that gets selected in the end.

This gradle dependencyInsight --configuration runtimeClasspath --dependency :guava: report, for example, shows that the JRE (standard-jvm) variant of Guava was selected – org.gradle.jvm.environment = standard-jvm – although the version String is 28.1-android.

com.google.guava:guava:28.1-android
   variant "standardJvmRuntime" [
      org.gradle.jvm.version         = 8 (compatible with: 11)
      org.gradle.jvm.environment     = standard-jvm
      org.gradle.status              = release (not requested)
      org.gradle.usage               = java-runtime
      org.gradle.libraryelements     = jar
      org.gradle.category            = library

      Requested attributes not found in the selected variant:
         org.gradle.dependency.bundling = external
   ]
   Selection reasons:
      - By conflict resolution : between versions 28.1-android, 28.0-jre and 26.0-android

This will put guava-28.1-jre.jar on the compile classpath, which the report does not show. You may add a small reporting task yourself if you want to check. For example:

tasks.register("printJars") {
  doLast {
    configurations.compileClasspath.get().files.forEach { println(it.name) }
  }
}

missing-metadata-guava's People

Contributors

jjohannes avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

missing-metadata-guava's Issues

Support for Guava 32?

Guava is now on v. 32.1. I got the following error:

  > Could not resolve com.google.guava:guava:32.1.2-jre.
     Required by:
         project :
      > The consumer was configured to find attribute 'org.gradle.dependency.bundling' with value 'external'. However we cannot choose between the following variants of com.google.guava:guava:32.1.2-jre:
          - androidRuntimeElements
          - jreRuntimeElements
        All of them match the consumer attributes:
          - Variant 'androidRuntimeElements' capabilities com.google.collections:google-collections:32.1.2-jre and com.google.guava:guava:32.1.2-jre declares attribute 'org.gradle.dependency.bundling' with value 'external':
              - Unmatched attributes:
                  - Provides org.gradle.category 'library' but the consumer didn't ask for it
                  - Provides org.gradle.jvm.environment 'android' but the consumer didn't ask for it
                  - Provides org.gradle.jvm.version '8' but the consumer didn't ask for it
                  - Provides org.gradle.libraryelements 'jar' but the consumer didn't ask for it
                  - Provides org.gradle.status 'release' but the consumer didn't ask for it
                  - Provides org.gradle.usage 'java-runtime' but the consumer didn't ask for it
          - Variant 'jreRuntimeElements' capabilities com.google.collections:google-collections:32.1.2-jre and com.google.guava:guava:32.1.2-jre declares attribute 'org.gradle.dependency.bundling' with value 'external':
              - Unmatched attributes:
                  - Provides org.gradle.category 'library' but the consumer didn't ask for it
                  - Provides org.gradle.jvm.environment 'standard-jvm' but the consumer didn't ask for it
                  - Provides org.gradle.jvm.version '8' but the consumer didn't ask for it
                  - Provides org.gradle.libraryelements 'jar' but the consumer didn't ask for it
                  - Provides org.gradle.status 'release' but the consumer didn't ask for it
                  - Provides org.gradle.usage 'java-runtime' but the consumer didn't ask for it

Will there be an update to this to support the latest version of Guava? Alternatively, is there a general set of rules that will tell others how to update this as Guava is updated?

"Module 'com.google.guava:guava' has been rejected" error during unit tests compilation

Hi.
I have an Android project where some modules have explicit dependency on Guava library just to workaround resolution conflicts. Guava itself is coming as transitive dependency from WorkManager, ExoPlayer, and probably some other libraries.

I've applied this plugin and was able to remove explicit dependency on Guava library. Application compiles. However unit tests compilation (assembleDebugUnitTest) fails with the error

Could not determine the dependencies of task ':settings:processDebugUnitTestResources'.
> Could not resolve all task dependencies for configuration ':settings:debugUnitTestRuntimeClasspath'.
   > Could not resolve com.google.guava:guava:27.0.1-jre.
     Required by:
         project :settings > org.robolectric:robolectric:4.7.2 > org.robolectric:resources:4.7.2
         project :settings > org.robolectric:robolectric:4.7.2 > org.robolectric:sandbox:4.7.2
         project :settings > org.robolectric:robolectric:4.7.2 > org.robolectric:utils:4.7.2
         project :settings > org.robolectric:robolectric:4.7.2 > org.robolectric:plugins-maven-dependency-resolver:4.7.2
         project :settings > org.robolectric:robolectric:4.7.2 > org.robolectric:shadows-framework:4.7.2 > org.robolectric:nativeruntime:4.7.2
      > Module 'com.google.guava:guava' has been rejected:
           Cannot select module with conflict on capability 'com.google.guava:listenablefuture:1.0' also provided by [com.google.guava:listenablefuture:1.0(runtime), com.google.guava:guava:27.0.1-jre(androidRuntime)]
   > Could not resolve com.google.guava:listenablefuture:1.0.
     Required by:
         project :settings > project :base_ui > androidx.work:work-runtime:2.5.0
         project :settings > project :navigation > androidx.browser:browser:1.3.0
         project :settings > project :navigation > androidx.browser:browser:1.3.0 > androidx.concurrent:concurrent-futures:1.0.0
      > Module 'com.google.guava:listenablefuture' has been rejected:
           Cannot select module with conflict on capability 'com.google.guava:listenablefuture:1.0' also provided by [com.google.guava:guava:27.0.1-jre(androidRuntime), com.google.guava:guava:27.1-android(runtime)]
   > Could not resolve com.google.guava:guava:27.1-android.
     Required by:
         project :settings > project :base-api > com.google.android.exoplayer:exoplayer:2.13.0 > com.google.android.exoplayer:exoplayer-core:2.13.0 > com.google.android.exoplayer:exoplayer-common:2.13.0
      > Module 'com.google.guava:guava' has been rejected:
           Cannot select module with conflict on capability 'com.google.guava:listenablefuture:1.0' also provided by [com.google.guava:listenablefuture:1.0(runtime), com.google.guava:guava:27.0.1-jre(androidRuntime)]

What confuses me is that If I don't apply de.jjohannes.missing-metadata-guava, then unit test compilation for this module passes. (In that case application compilation fails as I removed explicit Guava dependency). Compilation also passes if I add explicit dependency testImplementation "com.google.guava:guava:27.1-android" to this module.

Do I miss something? Do I have to use explicit testImplementation Guava dependency and it's the recommended way to go?

I attach result of ./gradlew myModule:dependencyInsight --configuration debugUnitTestRuntimeClasspath --dependency :guava:. Hope it gives you extra information.

When plugin is applied and assembleDebugUnitTest fails.

com.google.guava:guava:27.0.1-jre FAILED
   Failures:
      - Could not resolve com.google.guava:guava:27.0.1-jre.
          - Module 'com.google.guava:guava' has been rejected:
               Cannot select module with conflict on capability 'com.google.guava:listenablefuture:1.0' also provided by [com.google.guava:listenablefuture:1.0(runtime), com.google.guava:guava:27.0.1-jre(androidRuntime)]

com.google.guava:guava:27.0.1-jre FAILED
+--- org.robolectric:nativeruntime:4.7.2
|    \--- org.robolectric:shadows-framework:4.7.2
|         \--- org.robolectric:robolectric:4.7.2
|              \--- project :settings
|                   \--- project :settings (*)
+--- org.robolectric:plugins-maven-dependency-resolver:4.7.2
|    \--- org.robolectric:robolectric:4.7.2 (*)
+--- org.robolectric:resources:4.7.2
|    +--- org.robolectric:robolectric:4.7.2 (*)
|    \--- org.robolectric:shadows-framework:4.7.2 (*)
+--- org.robolectric:sandbox:4.7.2
|    +--- org.robolectric:robolectric:4.7.2 (*)
|    \--- org.robolectric:junit:4.7.2
|         \--- org.robolectric:robolectric:4.7.2 (*)
\--- org.robolectric:utils:4.7.2
     +--- org.robolectric:robolectric:4.7.2 (*)
     +--- org.robolectric:shadows-framework:4.7.2 (*)
     +--- org.robolectric:resources:4.7.2 (*)
     +--- org.robolectric:sandbox:4.7.2 (*)
     +--- org.robolectric:utils-reflector:4.7.2
     |    +--- org.robolectric:robolectric:4.7.2 (*)
     |    +--- org.robolectric:shadows-framework:4.7.2 (*)
     |    +--- org.robolectric:junit:4.7.2 (*)
     |    \--- org.robolectric:sandbox:4.7.2 (*)
     +--- org.robolectric:plugins-maven-dependency-resolver:4.7.2 (*)
     \--- org.robolectric:shadowapi:4.7.2
          +--- org.robolectric:shadows-framework:4.7.2 (*)
          +--- org.robolectric:junit:4.7.2 (*)
          \--- org.robolectric:sandbox:4.7.2 (*)

com.google.guava:guava:27.1-android FAILED
   Failures:
      - Could not resolve com.google.guava:guava:27.1-android. (already reported)

com.google.guava:guava:27.1-android FAILED
\--- com.google.android.exoplayer:exoplayer-common:2.13.0
     +--- com.google.android.exoplayer:exoplayer-core:2.13.0
     |    +--- com.google.android.exoplayer:exoplayer:2.13.0
     |    |    \--- project ... // other modules from the project
     |    +--- com.google.android.exoplayer:exoplayer-ui:2.13.0
     |    |    \--- com.google.android.exoplayer:exoplayer:2.13.0 (*)
     |    +--- com.google.android.exoplayer:exoplayer-dash:2.13.0
     |    |    \--- com.google.android.exoplayer:exoplayer:2.13.0 (*)
     |    +--- com.google.android.exoplayer:exoplayer-hls:2.13.0
     |    |    \--- com.google.android.exoplayer:exoplayer:2.13.0 (*)
     |    +--- com.google.android.exoplayer:exoplayer-smoothstreaming:2.13.0
     |    |    \--- com.google.android.exoplayer:exoplayer:2.13.0 (*)
     |    \--- com.google.android.exoplayer:exoplayer-transformer:2.13.0
     |         \--- com.google.android.exoplayer:exoplayer:2.13.0 (*)
     \--- com.google.android.exoplayer:exoplayer-extractor:2.13.0
          \--- com.google.android.exoplayer:exoplayer-core:2.13.0 (*)

(*) - dependencies omitted (listed previously)

When plugin is not applied and assembleDebugUnitTest passes

com.google.guava:guava:27.1-android
   variant "runtime" [
      org.gradle.status                              = release (not requested)
      org.gradle.usage                               = java-runtime
      org.gradle.libraryelements                     = jar (not requested)
      org.gradle.category                            = library (not requested)

      Requested attributes not found in the selected variant:
         com.android.build.api.attributes.BuildTypeAttr = debug
         org.gradle.jvm.environment                     = android
         org.jetbrains.kotlin.platform.type             = androidJvm
   ]
   Selection reasons:
      - By conflict resolution : between versions 27.1-android and 27.0.1-jre

com.google.guava:guava:27.1-android
\--- com.google.android.exoplayer:exoplayer-common:2.13.0
     +--- com.google.android.exoplayer:exoplayer-core:2.13.0
     |    +--- com.google.android.exoplayer:exoplayer:2.13.0
     |    |    \--- project ... // other modules from the project
     |    +--- com.google.android.exoplayer:exoplayer-ui:2.13.0
     |    |    \--- com.google.android.exoplayer:exoplayer:2.13.0 (*)
     |    +--- com.google.android.exoplayer:exoplayer-dash:2.13.0
     |    |    \--- com.google.android.exoplayer:exoplayer:2.13.0 (*)
     |    +--- com.google.android.exoplayer:exoplayer-hls:2.13.0
     |    |    \--- com.google.android.exoplayer:exoplayer:2.13.0 (*)
     |    +--- com.google.android.exoplayer:exoplayer-smoothstreaming:2.13.0
     |    |    \--- com.google.android.exoplayer:exoplayer:2.13.0 (*)
     |    \--- com.google.android.exoplayer:exoplayer-transformer:2.13.0
     |         \--- com.google.android.exoplayer:exoplayer:2.13.0 (*)
     \--- com.google.android.exoplayer:exoplayer-extractor:2.13.0
          \--- com.google.android.exoplayer:exoplayer-core:2.13.0 (*)

com.google.guava:guava:27.0.1-jre -> 27.1-android
+--- org.robolectric:nativeruntime:4.7.2
|    \--- org.robolectric:shadows-framework:4.7.2
|         \--- org.robolectric:robolectric:4.7.2
|              \--- project :settings
|                   \--- project :settings (*)
+--- org.robolectric:plugins-maven-dependency-resolver:4.7.2
|    \--- org.robolectric:robolectric:4.7.2 (*)
+--- org.robolectric:resources:4.7.2
|    +--- org.robolectric:robolectric:4.7.2 (*)
|    \--- org.robolectric:shadows-framework:4.7.2 (*)
+--- org.robolectric:sandbox:4.7.2
|    +--- org.robolectric:robolectric:4.7.2 (*)
|    \--- org.robolectric:junit:4.7.2
|         \--- org.robolectric:robolectric:4.7.2 (*)
\--- org.robolectric:utils:4.7.2
     +--- org.robolectric:robolectric:4.7.2 (*)
     +--- org.robolectric:shadows-framework:4.7.2 (*)
     +--- org.robolectric:resources:4.7.2 (*)
     +--- org.robolectric:sandbox:4.7.2 (*)
     +--- org.robolectric:utils-reflector:4.7.2
     |    +--- org.robolectric:robolectric:4.7.2 (*)
     |    +--- org.robolectric:shadows-framework:4.7.2 (*)
     |    +--- org.robolectric:junit:4.7.2 (*)
     |    \--- org.robolectric:sandbox:4.7.2 (*)
     +--- org.robolectric:plugins-maven-dependency-resolver:4.7.2 (*)
     \--- org.robolectric:shadowapi:4.7.2
          +--- org.robolectric:shadows-framework:4.7.2 (*)
          +--- org.robolectric:junit:4.7.2 (*)
          \--- org.robolectric:sandbox:4.7.2 (*)

(*) - dependencies omitted (listed previously)

When plugin is applied and explicit Guava dependencies is added via testImplementation. assembleDebugUnitTest passes.

com.google.guava:guava:27.1-android
   variant "runtime" [
      org.gradle.jvm.version                         = 6 (not requested)
      org.gradle.jvm.environment                     = android
      org.gradle.status                              = release (not requested)
      org.gradle.usage                               = java-runtime
      org.gradle.libraryelements                     = jar (not requested)
      org.gradle.category                            = library (not requested)

      Requested attributes not found in the selected variant:
         com.android.build.api.attributes.BuildTypeAttr = debug
         org.jetbrains.kotlin.platform.type             = androidJvm
   ]
   Selection reasons:
      - By conflict resolution : between versions 27.1-android and 27.0.1-jre

com.google.guava:guava:27.1-android
+--- project :settings
|    \--- project :settings (*)
\--- com.google.android.exoplayer:exoplayer-common:2.13.0
     +--- com.google.android.exoplayer:exoplayer-core:2.13.0
     |    +--- com.google.android.exoplayer:exoplayer:2.13.0
     |    |    \--- project ... // other modules from the project
     |    +--- com.google.android.exoplayer:exoplayer-dash:2.13.0
     |    |    \--- com.google.android.exoplayer:exoplayer:2.13.0 (*)
     |    +--- com.google.android.exoplayer:exoplayer-hls:2.13.0
     |    |    \--- com.google.android.exoplayer:exoplayer:2.13.0 (*)
     |    +--- com.google.android.exoplayer:exoplayer-smoothstreaming:2.13.0
     |    |    \--- com.google.android.exoplayer:exoplayer:2.13.0 (*)
     |    +--- com.google.android.exoplayer:exoplayer-transformer:2.13.0
     |    |    \--- com.google.android.exoplayer:exoplayer:2.13.0 (*)
     |    \--- com.google.android.exoplayer:exoplayer-ui:2.13.0
     |         \--- com.google.android.exoplayer:exoplayer:2.13.0 (*)
     \--- com.google.android.exoplayer:exoplayer-extractor:2.13.0
          \--- com.google.android.exoplayer:exoplayer-core:2.13.0 (*)

com.google.guava:guava:27.0.1-jre -> 27.1-android
+--- org.robolectric:nativeruntime:4.7.2
|    \--- org.robolectric:shadows-framework:4.7.2
|         \--- org.robolectric:robolectric:4.7.2
|              \--- project :settings
|                   \--- project :settings (*)
+--- org.robolectric:plugins-maven-dependency-resolver:4.7.2
|    \--- org.robolectric:robolectric:4.7.2 (*)
+--- org.robolectric:resources:4.7.2
|    +--- org.robolectric:robolectric:4.7.2 (*)
|    \--- org.robolectric:shadows-framework:4.7.2 (*)
+--- org.robolectric:sandbox:4.7.2
|    +--- org.robolectric:robolectric:4.7.2 (*)
|    \--- org.robolectric:junit:4.7.2
|         \--- org.robolectric:robolectric:4.7.2 (*)
\--- org.robolectric:utils:4.7.2
     +--- org.robolectric:robolectric:4.7.2 (*)
     +--- org.robolectric:shadows-framework:4.7.2 (*)
     +--- org.robolectric:resources:4.7.2 (*)
     +--- org.robolectric:sandbox:4.7.2 (*)
     +--- org.robolectric:utils-reflector:4.7.2
     |    +--- org.robolectric:robolectric:4.7.2 (*)
     |    +--- org.robolectric:shadows-framework:4.7.2 (*)
     |    +--- org.robolectric:junit:4.7.2 (*)
     |    \--- org.robolectric:sandbox:4.7.2 (*)
     +--- org.robolectric:plugins-maven-dependency-resolver:4.7.2 (*)
     \--- org.robolectric:shadowapi:4.7.2
          +--- org.robolectric:shadows-framework:4.7.2 (*)
          +--- org.robolectric:junit:4.7.2 (*)
          \--- org.robolectric:sandbox:4.7.2 (*)

(*) - dependencies omitted (listed previously)

Guava 31.1 is available

Hello,

Thank you for this plugin. It has helped us untangle some of these issues even though we don't fully understand how it all works :). Guava 31.1.1 was released on Feb 28, 2022. It looks like this plugin currently supports up to Guava 31.0.1.

We are running into a build error trying to update to Exoplayer 2.17.0, since that library now pulls in Guava 31.1.1.
Do you have plans to add support for Guava 31.1.1 to this plugin soon?

We are using exclude group for guava on our exoplayer dependency, but that doesn't seem to be enough to resolve the issue.

implementation "com.google.android.exoplayer:exoplayer:$exo_player_version", {
        exclude group: 'com.google.guava', module: 'guava'
}

Thank you again for this helpful plugin!

Document the plugin usage

This plugin is mentionned in several blogs and presentations, but declaring it is not enough.

E.g. suppose a project like this, with a transitive dependency to guava 28.1-android, how to use the plugin to select the jre variant, knowing this project will run on the JVM.

plugins {
    id 'java'
    id "de.jjohannes.missing-metadata-guava" version "0.1"
}

repositories {
    mavenCentral()
}

dependencies {
    implementation "com.google.cloud:google-cloud-bigtable:1.5.0"
}

compileJava {
    options.release.set(11)
}
dep insight
$  gradle dependencyInsight --dependency guava --configuration compileClasspath

> Task :dependencyInsight
com.google.guava:failureaccess:1.0.1
   variant "compile" [
      org.gradle.status              = release (not requested)
      org.gradle.usage               = java-api
      org.gradle.libraryelements     = jar (compatible with: classes)
      org.gradle.category            = library

      Requested attributes not found in the selected variant:
         org.gradle.dependency.bundling = external
         org.gradle.jvm.version         = 11
   ]

com.google.guava:failureaccess:1.0.1
\--- com.google.guava:guava:28.1-android
     +--- com.google.cloud:google-cloud-bigtable:1.5.0
     |    \--- compileClasspath
     +--- com.google.cloud:google-cloud-core-grpc:1.91.2
     |    \--- com.google.cloud:google-cloud-bigtable:1.5.0 (*)
     +--- com.google.api:gax-grpc:1.49.0
     |    +--- com.google.cloud:google-cloud-bigtable:1.5.0 (*)
     |    \--- com.google.cloud:google-cloud-core-grpc:1.91.2 (*)
     +--- com.google.cloud:google-cloud-core:1.91.2
     |    +--- com.google.cloud:google-cloud-bigtable:1.5.0 (*)
     |    \--- com.google.cloud:google-cloud-core-grpc:1.91.2 (*)
     +--- com.google.api:gax:1.49.0
     |    +--- com.google.cloud:google-cloud-bigtable:1.5.0 (*)
     |    +--- com.google.cloud:google-cloud-core-grpc:1.91.2 (*)
     |    +--- com.google.api:gax-grpc:1.49.0 (*)
     |    \--- com.google.cloud:google-cloud-core:1.91.2 (*)
     +--- com.google.api:api-common:1.8.1 (requested com.google.guava:guava:26.0-android)
     |    +--- com.google.cloud:google-cloud-bigtable:1.5.0 (*)
     |    +--- com.google.cloud:google-cloud-core-grpc:1.91.2 (*)
     |    +--- com.google.api:gax-grpc:1.49.0 (*)
     |    +--- com.google.cloud:google-cloud-core:1.91.2 (*)
     |    +--- com.google.api:gax:1.49.0 (*)
     |    +--- com.google.api.grpc:proto-google-cloud-bigtable-v2:0.81.0
     |    |    \--- com.google.cloud:google-cloud-bigtable:1.5.0 (*)
     |    +--- com.google.api.grpc:proto-google-cloud-bigtable-admin-v2:0.81.0
     |    |    \--- com.google.cloud:google-cloud-bigtable:1.5.0 (*)
     |    \--- com.google.api.grpc:proto-google-iam-v1:0.13.0
     |         +--- com.google.cloud:google-cloud-bigtable:1.5.0 (*)
     |         +--- com.google.cloud:google-cloud-core:1.91.2 (*)
     |         \--- com.google.api.grpc:proto-google-cloud-bigtable-admin-v2:0.81.0 (*)
     +--- io.grpc:grpc-protobuf:1.24.0 (requested com.google.guava:guava:26.0-android)
     |    +--- com.google.cloud:google-cloud-bigtable:1.5.0 (*)
     |    +--- com.google.api:gax-grpc:1.49.0 (requested io.grpc:grpc-protobuf:1.23.0) (*)
     |    +--- io.grpc:grpc-alts:1.23.0 (requested io.grpc:grpc-protobuf:1.23.0)
     |    |    \--- com.google.api:gax-grpc:1.49.0 (*)
     |    \--- io.grpc:grpc-grpclb:1.23.0 (requested io.grpc:grpc-protobuf:1.23.0)
     |         \--- io.grpc:grpc-alts:1.23.0 (*)
     +--- com.google.auth:google-auth-library-oauth2-http:0.17.2 (requested com.google.guava:guava:28.0-android)
     |    +--- com.google.api:gax-grpc:1.49.0 (*)
     |    +--- com.google.cloud:google-cloud-core:1.91.2 (*)
     |    +--- com.google.api:gax:1.49.0 (*)
     |    \--- io.grpc:grpc-alts:1.23.0 (requested com.google.auth:google-auth-library-oauth2-http:0.13.0) (*)
     +--- com.google.protobuf:protobuf-java-util:3.10.0 (requested com.google.guava:guava:28.0-android)
     |    +--- com.google.cloud:google-cloud-bigtable:1.5.0 (*)
     |    +--- com.google.cloud:google-cloud-core:1.91.2 (*)
     |    \--- io.grpc:grpc-grpclb:1.23.0 (requested com.google.protobuf:protobuf-java-util:3.9.0) (*)
     +--- io.grpc:grpc-protobuf-lite:1.24.0 (requested com.google.guava:guava:26.0-android)
     |    \--- io.grpc:grpc-protobuf:1.24.0 (*)
     +--- io.grpc:grpc-api:1.24.0 (requested com.google.guava:guava:26.0-android)
     |    +--- com.google.cloud:google-cloud-bigtable:1.5.0 (*)
     |    +--- com.google.cloud:google-cloud-core-grpc:1.91.2 (*)
     |    +--- io.grpc:grpc-protobuf:1.24.0 (*)
     |    +--- io.grpc:grpc-auth:1.24.0
     |    |    +--- com.google.cloud:google-cloud-bigtable:1.5.0 (*)
     |    |    +--- com.google.api:gax-grpc:1.49.0 (requested io.grpc:grpc-auth:1.23.0) (*)
     |    |    \--- io.grpc:grpc-alts:1.23.0 (requested io.grpc:grpc-auth:1.23.0) (*)
     |    +--- io.grpc:grpc-core:1.24.0
     |    |    +--- com.google.cloud:google-cloud-bigtable:1.5.0 (*)
     |    |    +--- com.google.cloud:google-cloud-core-grpc:1.91.2 (*)
     |    |    +--- io.grpc:grpc-alts:1.23.0 (requested io.grpc:grpc-core:1.23.0) (*)
     |    |    +--- io.grpc:grpc-grpclb:1.23.0 (requested io.grpc:grpc-core:1.23.0) (*)
     |    |    \--- io.grpc:grpc-netty-shaded:1.24.0
     |    |         +--- com.google.cloud:google-cloud-bigtable:1.5.0 (*)
     |    |         +--- com.google.api:gax-grpc:1.49.0 (requested io.grpc:grpc-netty-shaded:1.23.0) (*)
     |    |         \--- io.grpc:grpc-alts:1.23.0 (requested io.grpc:grpc-netty-shaded:1.23.0) (*)
     |    +--- io.grpc:grpc-stub:1.23.0 (requested io.grpc:grpc-api:1.23.0)
     |    |    +--- com.google.api:gax-grpc:1.49.0 (*)
     |    |    +--- io.grpc:grpc-alts:1.23.0 (*)
     |    |    \--- io.grpc:grpc-grpclb:1.23.0 (*)
     |    \--- io.grpc:grpc-protobuf-lite:1.24.0 (*)
     +--- com.google.http-client:google-http-client:1.32.1
     |    +--- com.google.cloud:google-cloud-core-grpc:1.91.2 (*)
     |    +--- com.google.cloud:google-cloud-core:1.91.2 (*)
     |    +--- com.google.auth:google-auth-library-oauth2-http:0.17.2 (*)
     |    \--- com.google.http-client:google-http-client-jackson2:1.32.1
     |         +--- com.google.cloud:google-cloud-core:1.91.2 (*)
     |         \--- com.google.auth:google-auth-library-oauth2-http:0.17.2 (*)
     \--- io.opencensus:opencensus-contrib-http-util:0.24.0 (requested com.google.guava:guava:26.0-android)
          \--- com.google.http-client:google-http-client:1.32.1 (*)

com.google.guava:guava:28.1-android
   variant "jdk8Compile" [
      org.gradle.jvm.version         = 8 (compatible with: 11)
      org.gradle.status              = release (not requested)
      org.gradle.usage               = java-api
      org.gradle.libraryelements     = jar (compatible with: classes)
      org.gradle.category            = library

      Requested attributes not found in the selected variant:
         org.gradle.dependency.bundling = external
   ]
   Selection reasons:
      - By conflict resolution : between versions 28.1-android, 26.0-android and 28.0-android

com.google.guava:guava:28.1-android
+--- com.google.api:gax:1.49.0
|    +--- com.google.cloud:google-cloud-bigtable:1.5.0
|    |    \--- compileClasspath
|    +--- com.google.cloud:google-cloud-core-grpc:1.91.2
|    |    \--- com.google.cloud:google-cloud-bigtable:1.5.0 (*)
|    +--- com.google.api:gax-grpc:1.49.0
|    |    +--- com.google.cloud:google-cloud-bigtable:1.5.0 (*)
|    |    \--- com.google.cloud:google-cloud-core-grpc:1.91.2 (*)
|    \--- com.google.cloud:google-cloud-core:1.91.2
|         +--- com.google.cloud:google-cloud-bigtable:1.5.0 (*)
|         \--- com.google.cloud:google-cloud-core-grpc:1.91.2 (*)
+--- com.google.api:gax-grpc:1.49.0 (*)
+--- com.google.cloud:google-cloud-bigtable:1.5.0 (*)
+--- com.google.cloud:google-cloud-core:1.91.2 (*)
+--- com.google.cloud:google-cloud-core-grpc:1.91.2 (*)
\--- com.google.http-client:google-http-client:1.32.1
     +--- com.google.cloud:google-cloud-core-grpc:1.91.2 (*)
     +--- com.google.cloud:google-cloud-core:1.91.2 (*)
     +--- com.google.auth:google-auth-library-oauth2-http:0.17.2
     |    +--- com.google.api:gax-grpc:1.49.0 (*)
     |    +--- com.google.cloud:google-cloud-core:1.91.2 (*)
     |    +--- com.google.api:gax:1.49.0 (*)
     |    \--- io.grpc:grpc-alts:1.23.0 (requested com.google.auth:google-auth-library-oauth2-http:0.13.0)
     |         \--- com.google.api:gax-grpc:1.49.0 (*)
     \--- com.google.http-client:google-http-client-jackson2:1.32.1
          +--- com.google.cloud:google-cloud-core:1.91.2 (*)
          \--- com.google.auth:google-auth-library-oauth2-http:0.17.2 (*)

com.google.guava:guava:26.0-android -> 28.1-android
+--- com.google.api:api-common:1.8.1
|    +--- com.google.cloud:google-cloud-bigtable:1.5.0
|    |    \--- compileClasspath
|    +--- com.google.cloud:google-cloud-core-grpc:1.91.2
|    |    \--- com.google.cloud:google-cloud-bigtable:1.5.0 (*)
|    +--- com.google.api:gax-grpc:1.49.0
|    |    +--- com.google.cloud:google-cloud-bigtable:1.5.0 (*)
|    |    \--- com.google.cloud:google-cloud-core-grpc:1.91.2 (*)
|    +--- com.google.cloud:google-cloud-core:1.91.2
|    |    +--- com.google.cloud:google-cloud-bigtable:1.5.0 (*)
|    |    \--- com.google.cloud:google-cloud-core-grpc:1.91.2 (*)
|    +--- com.google.api:gax:1.49.0
|    |    +--- com.google.cloud:google-cloud-bigtable:1.5.0 (*)
|    |    +--- com.google.cloud:google-cloud-core-grpc:1.91.2 (*)
|    |    +--- com.google.api:gax-grpc:1.49.0 (*)
|    |    \--- com.google.cloud:google-cloud-core:1.91.2 (*)
|    +--- com.google.api.grpc:proto-google-cloud-bigtable-v2:0.81.0
|    |    \--- com.google.cloud:google-cloud-bigtable:1.5.0 (*)
|    +--- com.google.api.grpc:proto-google-cloud-bigtable-admin-v2:0.81.0
|    |    \--- com.google.cloud:google-cloud-bigtable:1.5.0 (*)
|    \--- com.google.api.grpc:proto-google-iam-v1:0.13.0
|         +--- com.google.cloud:google-cloud-bigtable:1.5.0 (*)
|         +--- com.google.cloud:google-cloud-core:1.91.2 (*)
|         \--- com.google.api.grpc:proto-google-cloud-bigtable-admin-v2:0.81.0 (*)
+--- io.grpc:grpc-api:1.24.0
|    +--- com.google.cloud:google-cloud-bigtable:1.5.0 (*)
|    +--- com.google.cloud:google-cloud-core-grpc:1.91.2 (*)
|    +--- io.grpc:grpc-protobuf:1.24.0
|    |    +--- com.google.cloud:google-cloud-bigtable:1.5.0 (*)
|    |    +--- com.google.api:gax-grpc:1.49.0 (requested io.grpc:grpc-protobuf:1.23.0) (*)
|    |    +--- io.grpc:grpc-alts:1.23.0 (requested io.grpc:grpc-protobuf:1.23.0)
|    |    |    \--- com.google.api:gax-grpc:1.49.0 (*)
|    |    \--- io.grpc:grpc-grpclb:1.23.0 (requested io.grpc:grpc-protobuf:1.23.0)
|    |         \--- io.grpc:grpc-alts:1.23.0 (*)
|    +--- io.grpc:grpc-auth:1.24.0
|    |    +--- com.google.cloud:google-cloud-bigtable:1.5.0 (*)
|    |    +--- com.google.api:gax-grpc:1.49.0 (requested io.grpc:grpc-auth:1.23.0) (*)
|    |    \--- io.grpc:grpc-alts:1.23.0 (requested io.grpc:grpc-auth:1.23.0) (*)
|    +--- io.grpc:grpc-core:1.24.0
|    |    +--- com.google.cloud:google-cloud-bigtable:1.5.0 (*)
|    |    +--- com.google.cloud:google-cloud-core-grpc:1.91.2 (*)
|    |    +--- io.grpc:grpc-alts:1.23.0 (requested io.grpc:grpc-core:1.23.0) (*)
|    |    +--- io.grpc:grpc-grpclb:1.23.0 (requested io.grpc:grpc-core:1.23.0) (*)
|    |    \--- io.grpc:grpc-netty-shaded:1.24.0
|    |         +--- com.google.cloud:google-cloud-bigtable:1.5.0 (*)
|    |         +--- com.google.api:gax-grpc:1.49.0 (requested io.grpc:grpc-netty-shaded:1.23.0) (*)
|    |         \--- io.grpc:grpc-alts:1.23.0 (requested io.grpc:grpc-netty-shaded:1.23.0) (*)
|    +--- io.grpc:grpc-stub:1.23.0 (requested io.grpc:grpc-api:1.23.0)
|    |    +--- com.google.api:gax-grpc:1.49.0 (*)
|    |    +--- io.grpc:grpc-alts:1.23.0 (*)
|    |    \--- io.grpc:grpc-grpclb:1.23.0 (*)
|    \--- io.grpc:grpc-protobuf-lite:1.24.0
|         \--- io.grpc:grpc-protobuf:1.24.0 (*)
+--- io.grpc:grpc-protobuf:1.24.0 (*)
+--- io.grpc:grpc-protobuf-lite:1.24.0 (*)
\--- io.opencensus:opencensus-contrib-http-util:0.24.0
     \--- com.google.http-client:google-http-client:1.32.1
          +--- com.google.cloud:google-cloud-core-grpc:1.91.2 (*)
          +--- com.google.cloud:google-cloud-core:1.91.2 (*)
          +--- com.google.auth:google-auth-library-oauth2-http:0.17.2
          |    +--- com.google.api:gax-grpc:1.49.0 (*)
          |    +--- com.google.cloud:google-cloud-core:1.91.2 (*)
          |    +--- com.google.api:gax:1.49.0 (*)
          |    \--- io.grpc:grpc-alts:1.23.0 (requested com.google.auth:google-auth-library-oauth2-http:0.13.0) (*)
          \--- com.google.http-client:google-http-client-jackson2:1.32.1
               +--- com.google.cloud:google-cloud-core:1.91.2 (*)
               \--- com.google.auth:google-auth-library-oauth2-http:0.17.2 (*)

com.google.guava:guava:28.0-android -> 28.1-android
+--- com.google.auth:google-auth-library-oauth2-http:0.17.2
|    +--- com.google.api:gax-grpc:1.49.0
|    |    +--- com.google.cloud:google-cloud-bigtable:1.5.0
|    |    |    \--- compileClasspath
|    |    \--- com.google.cloud:google-cloud-core-grpc:1.91.2
|    |         \--- com.google.cloud:google-cloud-bigtable:1.5.0 (*)
|    +--- com.google.cloud:google-cloud-core:1.91.2
|    |    +--- com.google.cloud:google-cloud-bigtable:1.5.0 (*)
|    |    \--- com.google.cloud:google-cloud-core-grpc:1.91.2 (*)
|    +--- com.google.api:gax:1.49.0
|    |    +--- com.google.cloud:google-cloud-bigtable:1.5.0 (*)
|    |    +--- com.google.cloud:google-cloud-core-grpc:1.91.2 (*)
|    |    +--- com.google.api:gax-grpc:1.49.0 (*)
|    |    \--- com.google.cloud:google-cloud-core:1.91.2 (*)
|    \--- io.grpc:grpc-alts:1.23.0 (requested com.google.auth:google-auth-library-oauth2-http:0.13.0)
|         \--- com.google.api:gax-grpc:1.49.0 (*)
\--- com.google.protobuf:protobuf-java-util:3.10.0
     +--- com.google.cloud:google-cloud-bigtable:1.5.0 (*)
     +--- com.google.cloud:google-cloud-core:1.91.2 (*)
     \--- io.grpc:grpc-grpclb:1.23.0 (requested com.google.protobuf:protobuf-java-util:3.9.0)
          \--- io.grpc:grpc-alts:1.23.0 (*)

(*) - dependencies omitted (listed previously)

A web-based, searchable dependency report is available by adding the --scan option.

BUILD SUCCESSFUL in 662ms
1 actionable task: 1 executed

For now the simpliest solution is to declare the dependency itself.

    implementation "com.google.guava:guava:29.0-jre"

But then it requires more manual intervention to align the version with the transitive one. E.g. if trnasitive is bumped to 30, this require to bump this dependency as well.

I've seen the substution DSL, but this requires more lines, and suffer from the same drawback, I need to set the version.

configurations.all {
    resolutionStrategy.dependencySubstitution {
        substitute module('com.google.guava:guava') using module('com.google.guava:guava:29.0-jre') withoutClassifier()
    }
}

GuavaMetadataPlugin is package-private, cannot be referenced programtically

Am unable to apply plugin programatically (via another plugin) using Kotlin:

This construct:
plugins.apply(de.jjohannes.gradle.missingmetadata.guava.GuavaMetadataPlugin::class)

will not compile as GuavaMetadataPlugin is package-private.

Workaround is to stringly-type the reference:

plugins.apply("de.jjohannes.missing-metadata-guava")

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.