This is a reasonable thing to want to do. A new version of pulsar which officially supports the upgraded library would be better, but you can often upgrade transitive dependencies safely. Particularly, point releases (i.e. 2.8.6 -> 2.8.9) are likely to be safe if library authors are following semantic versioning.
Gradle provides several ways to do this, it seems like the most idomatic way right now (as of gradle 7.3) is to use constraints.
For example, if your dependencies look like this:
dependencies {
implementation 'org.apache.pulsar:pulsar-client-all:2.9.1'
}
Running dependency insights will show that we're resolving gson 2.8.6
`./gradlew dependencyInsight --dependency gson`
...
com.google.code.gson:gson:2.8.6
\--- org.apache.pulsar:pulsar-package-core:2.9.1
\--- org.apache.pulsar:pulsar-client-all:2.9.1
\--- compileClasspath
We can add a constraint which will force it to use a newer version like this.
dependencies {
implementation 'org.apache.pulsar:pulsar-client-all:2.9.1'
constraints {
implementation('com.google.code.gson:gson:2.8.9') {
because 'previous versions have a security vulnerability'
}
}
}
Now we get the following result
com.google.code.gson:gson:2.8.9
...
Selection reasons:
- By constraint : previous versions have a security vulnerability
- By conflict resolution : between versions 2.8.9 and 2.8.6
com.google.code.gson:gson:2.8.9
\--- compileClasspath
com.google.code.gson:gson:2.8.6 -> 2.8.9
\--- org.apache.pulsar:pulsar-package-core:2.9.1
\--- org.apache.pulsar:pulsar-client-all:2.9.1
\--- compileClasspath
It's now resolving 2.8.9 like you want.
Gradle has pretty extensive documentation about dependency management which is a great way to find more information about things like this.