Gradle Dependencies for Java, use compile or implementation?
While I was explaining to a colleague about using Gradle for Java projects (he was moving away from Maven), we came across various code samples. Some of the examples were using the compile configuration for dependencies, while others were using implements and api.
dependencies { compile 'commons-httpclient:commons-httpclient:3.1' compile 'org.apache.commons:commons-lang3:3.5' }
dependencies { api 'commons-httpclient:commons-httpclient:3.1' implementation 'org.apache.commons:commons-lang3:3.5' }
This post was a summary based on the documentation and StackOverflow questions to explain to him which configurations to use.
New Dependency Configurations
Gradle 3.4 introduced the Java-library plugin, which included the then new configurations implementation and api (amongst others). These were meant to replace the compile configuration which was deprecated for this plugin. The idea was that the new configurations would help to prevent leaking of transitive dependencies for multi-module projects.
Please note that in this post I am just using the compile vs implementation/api configurations as an example. Other new replacement configurations were introduced as well, please read the documentation for further information.
Java
For a Java project using Gradle 3.4+, then it depends on whether you are build an application or a library.
For a library project or a library module in a multiple module project, it is recommended to use the Java-library plugin, so in build.gradle use this
apply plugin: 'java-library'
instead of
apply plugin: 'java'
Then you would use either implementation or api, depending on whether you want to expose the dependency to consumers of the library.
For a plain application project, you can stick with the java plugin and continue to use the compile configuration. Having said that, I have tried using the Java-library plugin for an app project and it seems to work fine.
Android
For an Android project, the new configurations came with the Android Gradle Plugin 3.0. So unless you are still using the 2.x version of Android Studio / Android Gradle plugin, the use of compile is deprecated. So you should use implementation, even for an app.
In fact, when I recently upgraded my Android Studio, it came up with the message:
Configuration ‘compile’ is obsolete and has been replaced with ‘implementation’.
It will be removed at the end of 2018
I think this also applies if you use Kotlin instead of Java.
Groovy
How about a project with Groovy as well as Java? This can be for a mixed Groovy / Java project, or for a Java project which needs Groovy for some support tools (such as Spock or Logback configuration).
In the past I have used the Groovy plugin instead of the Java plugin for mixed projects. The Groovy plugin extends the Java plugin and will handle the compilation for Java sources as well as Groovy sources.
apply plugin: 'groovy'
You can continue to do this for Java application modules, but the documentation states that the Groovy plugin has compatibility issues with the Java-library plugin so will need a work around for library modules.
Of course this short post is for newbies, and has only scratched the surface in terms of learning about all the new dependency configurations.
Published on Java Code Geeks with permission by David Wong, partner at our JCG program. See the original article here: Gradle Dependencies for Java, use compile or implementation? Opinions expressed by Java Code Geeks contributors are their own. |