Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

guava:32.1.2-jre make checkstyle fail #6825

Open
LiYing2010 opened this issue Nov 8, 2023 · 3 comments
Open

guava:32.1.2-jre make checkstyle fail #6825

LiYing2010 opened this issue Nov 8, 2023 · 3 comments
Assignees

Comments

@LiYing2010
Copy link

Description

We are using checkstyle plugin in a gradle (v8.3) project
checkstyle is the latest version 10.12.4, and our project also use com.google.guava:guava:31.1-jre
and everything works fine

but when I upgrade guava to 32.1.2-jre, it make checkstyle failed with following error:

Execution failed for task ':myproject:checkstyleMain'.
> Could not resolve all files for configuration ':myproject:checkstyle'.
   > Could not resolve com.google.guava:guava:32.0.1-jre.
     Required by:
         project :myproject > com.puppycrawl.tools:checkstyle:10.12.4
      > Module 'com.google.guava:guava' has been rejected:
           Cannot select module with conflict on capability 'com.google.collections:google-collections:32.1.2-jre' also provided by [com.google.collections:google-collections:1.0(runtime)]
   > Could not resolve com.google.collections:google-collections:1.0.
     Required by:
         project :myproject > com.puppycrawl.tools:checkstyle:10.12.4 > org.apache.maven.doxia:doxia-core:1.12.0 > org.codehaus.plexus:plexus-container-default:2.1.0
      > Module 'com.google.collections:google-collections' has been rejected:
           Cannot select module with conflict on capability 'com.google.collections:google-collections:1.0' also provided by [com.google.guava:guava:32.1.2-jre(jreRuntimeElements)]

some investigation:

I checked the dependency list of checkstyle : https://checkstyle.sourceforge.io/dependencies.html
looks like it depends on com.google.guava:guava:32.0.1-jre
and there is a transitive dependency com.google.collections:google-collections:1.0 too

which means, guava:32.0.1-jre + google-collections:1.0 + checkstyle 10.12.4 should work

so I changed my dependency to guava:32.0.1-jre, and it worked!

I tested some versions of guava:
32.1.0-jre ---> failed with same error
32.1.1-jre ---> failed with same error
32.1.2-jre ---> failed with same error
32.1.3-jre ---> failed with same error

32.0.0-jre ---> works fine
32.0.1-jre ---> works fine
31.1-jre ---> works fine

looks like this error only occurs in 32.1.x version

and I check the maven repo: https://repo1.maven.org/maven2/com/google/guava/guava/
the only strange thing I found is:
all the 32.1.x version has a file guava-32.1.x-jre.module, with following content:

      "capabilities": [
        {
          "group": "com.google.collections",
          "name": "google-collections",
          "version": "32.1.x-jre"
        },
      ]
    },

I am not sure, but I guess this is why gradle cannot resolve com.google.collections:google-collections:1.0 ?

Example

......

    apply plugin: 'checkstyle'

    ......

    checkstyle {
        toolVersion = '10.12.4'
        configFile = file("${rootProject.rootDir}/config/checkstyle/checkstyle.xml")
        ignoreFailures true
        sourceSets = [project.sourceSets.main] // ignore test code checkstyle
    }

    dependencyManagement {
        dependencies {
            ......

            dependency 'com.google.guava:guava:31.1-jre'

            ......
        }
    }


### Expected Behavior

`checkstyle` should run without error

### Actual Behavior

`checkstyle` fails

### Packages

_No response_

### Platforms

_No response_

### Checklist

- [X] I agree to follow the [code of conduct](https://github.com/google/.github/blob/master/CODE_OF_CONDUCT.md).
@LiYing2010
Copy link
Author

I reproduced this issue with a very simple build script:

build.gradle.kts:

plugins {
    java
}

repositories {
    mavenCentral()
    maven { setUrl("https://repo.maven.apache.org/maven2") }
}

dependencies {
    implementation("com.google.guava:guava:31.1-jre")
    implementation("com.google.collections:google-collections:1.0")
}

and tested for some versions:
32.0.0-jre ---> works fine
32.0.1-jre ---> works fine
31.1-jre ---> works fine

32.1.0-jre ---> failed with same error
32.1.1-jre ---> failed with same error
32.1.2-jre ---> failed with same error
32.1.3-jre ---> failed with same error

error message is:

Could not resolve: com.google.guava:guava:32.1.0-jre
Could not resolve: com.google.collections:google-collections:1.0
Could not resolve: com.google.guava:guava:32.1.0-jre
Could not resolve: com.google.collections:google-collections:1.0

@LiYing2010
Copy link
Author

LiYing2010 commented Nov 9, 2023

oh

I found this in your release note:

Reporting dependencies that overlap with Guava
If your dependency graph contains the very old google-collections or the hacky listenablefuture, Gradle will now report that those libraries contain duplicates of Guava classes. When this happens, you'll need to tell Gradle to select Guava:

configurations.all {
resolutionStrategy.capabilitiesResolution.withCapability("com.google.collections:google-collections") {
select("com.google.guava:guava:0")
}
// and/or
resolutionStrategy.capabilitiesResolution.withCapability("com.google.guava:listenablefuture") {
select("com.google.guava:guava:0")
}
}

I added the following to my test build script:

configurations.all {
    resolutionStrategy.capabilitiesResolution.withCapability("com.google.collections:google-collections") {
        select("com.google.guava:guava:0")
    }
}

and it fixed the dependencies conflict in that test build script

but I am confused, is this a workaround? or the official solution?

also, this does NOT work for our real project,
because google-collections is not a dependency of our project, but a transitive dependency of checkstyle plugin

I don't know how to tell gradle to select guava over google-collections in plugin dependency

@LiYing2010
Copy link
Author

oh~~~
good news

this workaround works for our real project: 😅

    dependencies {
        modules {
            // replace old dependency `google-collections` with `guava`
            module("com.google.collections:google-collections") {
                replacedBy("com.google.guava:guava", "google-collections is part of guava")
            }
        }
    }

looks like it also applied to the transitive dependency of checkstyle plugin

now our project works just fine ~~~

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants