Gradle - getting the latest release version of a dependency
Solution 1
Gradle currently does not support Maven's RELEASE
(which is rarely used and deprecated) but it does support Ivy's latest.release
(and for snapshots latest.integration
). However, the general recommendation is to build against exact versions. Otherwise, the build can become a lottery.
Solution 2
It can be quite useful sometimes to get the latest release - if for example you release often your own dependencies.
You can get the latest version like
compile "junit:junit:+"
or better specify at least the major version like
compile "junit:junit:4.+"
Solution 3
Check out the Gradle-Versions-Plugin. It does exactly what you want: https://github.com/ben-manes/gradle-versions-plugin
For the installation, see the github page. Basically you need to add these two lines to your build.gradle - project file:
apply plugin: 'com.github.ben-manes.versions'
buildscript {
[...]
dependencies {
classpath 'com.github.ben-manes:gradle-versions-plugin:0.8'
[...]
}
}
[...]
Then you can use the plugin, by running this command in terminal in your project dir:
./gradlew dependencyUpdates -Drevision=release
And it will show you which dependencies are outdated!
Solution 4
Latest Gradle User Guide mentions and explains plus sign in versions:
From 7.2. Declaring your dependencies:
dependencies { compile group: 'org.hibernate', name: 'hibernate-core', version: '3.6.7.Final' testCompile group: 'junit', name: 'junit', version: '4.+' }
... The build script also states that any junit >= 4.0 is required to compile the project's tests.
From 23.7. How dependency resolution works:
If the dependency is declared as a dynamic version (like 1.+), Gradle will resolve this to the newest available static version (like 1.2) in the repository. For Maven repositories, this is done using the maven-metadata.xml file, while for Ivy repositories this is done by directory listing.
Solution 5
In Android Studio:
If you're using +
for the version, and want to know which version is actually being used, select Project
in the sidebar, and then under External Libraries
you will see the actual version number in use.
Related videos on Youtube
Yippie-Ki-Yay
Updated on July 08, 2022Comments
-
Yippie-Ki-Yay almost 2 years
What would be the easiest way to tell
Gradle
the following:Retrieve 'junit' dependency and take its latest 'release' version.
Managing Maven and Ivy repositories is sort of new to me. I tried the following steps and they result in
Could not resolve dependency ...
error:Write
compile "junit:junit:latest.release"
with repositories set to onlymavenCentral()
(however, it works if I say "junit:junit:4.10").Write
compile "junit:junit:latest.release"
with repository set the following way:ivy { // I also tried 'http://maven.org' and other possible variants. url "http://repo1.maven.org" layout "maven" }
Attempted to use Spring Source Ivy repository:
ivy { artifactPattern "http://repository.springsource.com/ivy/libraries/release/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" ivyPattern "http://repository.springsource.com/ivy/libraries/release/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" }
Maybe I misunderstand something. Why would getting the latest version of the dependency be such a hard task?
-
Bhavik over 7 yearsDynamic version can be a placeholder for the latest version available,
latest.integration
. gradle documentation for dynamic versions
-
khmarbaise about 12 yearsMaven doesn't support RELEASE as well. Only fixed version numbers.
-
Peter Niederwieser about 12 yearsI've double checked. Maven does support
RELEASE
, both in version 2 and 3. -
khmarbaise about 12 yearsYou are right. I've mistaken that with the plugin versions, cause for Maven 3 it does not allow RELEASE/LATEST anymore. But it's of course bad practice to use such version identifiers.
-
azonli about 11 yearsjust for the record: that should indeed be double-quotes! I've been using single-quotes for most of my dependency declarations and found out that
code 'junit:junit:4.+'
doesn't work -
prashant about 10 years@azonli Seems to work for me with single quotes, at least for local dependencies. What error do you get?
-
RCross over 9 yearsAn artifact in a Maven Release repository is one that has completed all possible automated (and perhaps manual) testing. That process should include API compatibility checks, regression testing and so on. Why then can the build become a lottery? Only if you are "releasing" artifacts that have not been sufficiently tested.
-
Peter Niederwieser over 9 yearsIf you don't know what you are building against, you can't reason about compatibility anymore (especially if it's not just the patch level you don't know about), and have also lost the ability to reproduce the build later on. Anyway, by now Gradle supports
latest.release
(both for Ivy and Maven repos) and, if I'm not mistaken, evenRELEASE
. -
RCross over 8 yearsGrade supports 'latest.release' (but not 'RELEASE'). This is extremely useful for ensuring that your own internal libraries are at the most recent, proven version - I would of course never advocate its use for external/3rd-party libraries for the same reason Peter suggests above.
-
Martin Dürrmeier over 8 yearsshouldn't it be "testCompile" instead of "compile"? because artifact is not needed in a release
-
Simon Forsberg about 8 yearsThis approach will not make builds reproducible, I think Ben Marten's answer is a better approach.
-
Lakatos Gyula over 7 yearsYou doesn't always need a reproducible build.
-
will over 7 years@SimonForsberg ... True, however when you are under-development you may want to (a) follow the bleeding-edge or (b) ensure bug-fixes for v
4.+
are kept up to date for your project. When you reach Alpha, Beta, -RC or -RELEASE stage; I totally agree you need to 'nail' those versions to a pole. I use aproperties' file to set version specifiers:
compile "junit:junit:${junitVer}"`. -
Laurence Gonsalves about 6 yearsYou can also add this to an initscript if you don't want to have to include the plugin in every one of your projects. See this answer to another question for details.
-
Barry Kelly about 4 yearswhat if the dependencies are in the same repo, and you always want the latest version?
-
e-info128 almost 4 yearsCaution: the last version include the alpha and beta versions, by example for
com.android.tools.build:gradle
from google repository. -
Harry G. almost 4 yearsImportant hint: the + does not necessarily take the latest version. It just takes any version satisfying the requested version string in any way. Means: if Gradle has already something in its cache (say 4.1), it won't download a newer version (say 4.21)! To really use the latest version you need to call Gradle with --refresh-dependencies additionally to the +
-
Harry G. almost 4 yearsImportant hint: the + does not necessarily take the latest version. See my comment above.
-
Brice about 2 yearsIt doesn't seem to work for snapshots though. Ahh it's
latest.integration
!