174e88debSCassandra TargettDependencies 274e88debSCassandra Targett============ 374e88debSCassandra Targett 474e88debSCassandra TargettEach gradle project can have multiple (named) "configurations" 574e88debSCassandra Targettand each configuration can have dependencies attached to it. 674e88debSCassandra Targett 774e88debSCassandra TargettThere are some standard conventions so, for example, the Java plugin 874e88debSCassandra Targettadds standard configurations such as "api", "implementation", 974e88debSCassandra Targett"testImplementation" and others. These configurations can also inherit 1074e88debSCassandra Targettfrom each other; more about this typic can be found here: 1174e88debSCassandra Targett 1274e88debSCassandra Targetthttps://docs.gradle.org/current/userguide/dependency_management_for_java_projects.html#dependency_management_for_java_projects 1374e88debSCassandra Targetthttps://docs.gradle.org/current/userguide/java_library_plugin.html#sec:java_library_separation 1474e88debSCassandra Targetthttps://docs.gradle.org/current/userguide/java_plugin.html#sec:java_plugin_and_dependency_management 1574e88debSCassandra Targett 16*1679076bSDawid WeissLucene typically uses three configurations and attach project 17*1679076bSDawid Weissdependencies to them: 1874e88debSCassandra Targett 1974e88debSCassandra Targettapi - makes a dependency available for main classes, tests and any 2074e88debSCassandra Targett other modules importing the project (exportable dependency), 2174e88debSCassandra Targett 2274e88debSCassandra Targettimplementation - makes a dependency available for main classes, tests 2374e88debSCassandra Targett but will *not* export the dependency for other modules (so their 2474e88debSCassandra Targett compilation classpath won't contain it). 2574e88debSCassandra Targett 2674e88debSCassandra TargetttestImplementation - makes a dependency only available for test classes. 2774e88debSCassandra Targett 2874e88debSCassandra Targett 2974e88debSCassandra TargettAdding a library dependency 3074e88debSCassandra Targett--------------------------- 3174e88debSCassandra Targett 3274e88debSCassandra TargettLet's say we wish to add a dependency on library "foo.bar:baz" in 3374e88debSCassandra Targettversion 1.2 to :lucene:core. Let's assume this library is only 3474e88debSCassandra Targettused internally by the project. The :lucene:core project is configured 3574e88debSCassandra Targettby lucene/core/build.gradle and we would add (or modify) the dependency 3674e88debSCassandra Targettblock as follows: 3774e88debSCassandra Targett 3874e88debSCassandra Targettdependencies { 3974e88debSCassandra Targett implementation "foo.bar:baz" 4074e88debSCassandra Targett} 4174e88debSCassandra Targett 4274e88debSCassandra TargettThe "implementation" here is a named configuration; we don't need to declare 4374e88debSCassandra Targettit because it is declared for us by the java-library plugin. 4474e88debSCassandra Targett 4574e88debSCassandra TargettIn "normal" gradle the version of the dependency would be present 4674e88debSCassandra Targettdirectly inside the declaration but we use a plugin 4774e88debSCassandra Targett(palantir-consistent-versions) to manage all dependency versions 4874e88debSCassandra Targettfrom the top-level (so that conflicts can be resolved globally). 4974e88debSCassandra Targett 5074e88debSCassandra TargettIf this is the first time "foo.bar:baz" is added to the project, we'd have 5174e88debSCassandra Targettto add its version to "versions.props" file at the top level of the 5274e88debSCassandra Targettcheckout: 5374e88debSCassandra Targett 5474e88debSCassandra Targettfoo.bar:baz=1.2 5574e88debSCassandra Targett 5674e88debSCassandra Targettand then regenerate the "versions.lock" file using the following 5774e88debSCassandra Targettcommand: 5874e88debSCassandra Targett 5974e88debSCassandra Targettgradlew --write-locks 6074e88debSCassandra Targett 6174e88debSCassandra TargettIMPORTANT: The versions.lock file will contain the actual version 6274e88debSCassandra Targettof the dependency picked based on other project dependencies and 6374e88debSCassandra Targetttheir transitive dependencies. This selected version may be 6474e88debSCassandra Targettdifferent from what each of these actually requires (the highest 6574e88debSCassandra Targettversion number will be typically selected). To see which dependencies 6674e88debSCassandra Targettrequire which version of the library use: 6774e88debSCassandra Targett 6874e88debSCassandra Targettgradlew why --hash=... 6974e88debSCassandra Targett 7074e88debSCassandra Targettwhere the hash code comes from versions.lock file. For example, at 7174e88debSCassandra Targettthe time of writing, jackson-databind has the following entry: 7274e88debSCassandra Targett 7374e88debSCassandra Targettcom.fasterxml.jackson.core:jackson-databind:2.10.0 (3 constraints: 931a7796) 7474e88debSCassandra Targett 7574e88debSCassandra Targettand "gradlew why --hash=931a7796" prints: 7674e88debSCassandra Targett 7774e88debSCassandra Targettcom.fasterxml.jackson.core:jackson-databind:2.10.0 7874e88debSCassandra Targett projects -> 2.10.0 7974e88debSCassandra Targett net.thisptr:jackson-jq -> 2.7.0 8074e88debSCassandra Targett org.carrot2:carrot2-mini -> 2.9.9.3 8174e88debSCassandra Targett 8274e88debSCassandra TargettOnce the dependency is added it always makes sense to see the 8374e88debSCassandra Targetttree of all module dependencies and maybe exclude transitive 8474e88debSCassandra Targettdependencies of foo.bar:baz that we won't need. 8574e88debSCassandra Targett 8674e88debSCassandra Targett 8774e88debSCassandra TargettInspecting current dependencies 8874e88debSCassandra Targett------------------------------- 8974e88debSCassandra Targett 9074e88debSCassandra TargettThe tree of dependencies of a project (in all configurations) can 9174e88debSCassandra Targettbe dumped by the following command (example): 9274e88debSCassandra Targett 9374e88debSCassandra Targettgradlew -p lucene\analysis\icu dependencies 9474e88debSCassandra Targett 9574e88debSCassandra TargettBut this can be a bit overwhelming; we will most likely be interested 9674e88debSCassandra Targettin just the "publicly visible" and "classpath-visible" configurations. 9774e88debSCassandra Targett 9874e88debSCassandra TargettThe publicly visible project dependencies (classes shared by other 9974e88debSCassandra Targettmodules importing our module) can be displayed with: 10074e88debSCassandra Targett 10174e88debSCassandra Targettgradlew -p lucene\analysis\icu dependencies --configuration api 10274e88debSCassandra Targett 10374e88debSCassandra TargettAnd the "private" set of dependencies (real classpath) can be dumped 10474e88debSCassandra Targettwith: 10574e88debSCassandra Targett 10674e88debSCassandra Targettgradlew -p lucene\analysis\icu dependencies --configuration runtimeClasspath 10774e88debSCassandra Targett 10874e88debSCassandra Targett 10974e88debSCassandra TargettExcluding a transitive dependency 11074e88debSCassandra Targett--------------------------------- 11174e88debSCassandra Targett 11274e88debSCassandra TargettLet's say "foo.bar:baz" has a transitive dependency on project 11374e88debSCassandra Targett"foo.bar:irrelevant" and we know the transitive dependency is not 11474e88debSCassandra Targettcrucial for the functioning of "foo.bar:baz". We can exclude it 11574e88debSCassandra Targettby adding an exclusion block to the original declaration: 11674e88debSCassandra Targett 11774e88debSCassandra Targettdependencies { 11874e88debSCassandra Targett implementation("foo.bar:baz", { 11974e88debSCassandra Targett exclude group: "foo.bar", module: "irrelevant" 12074e88debSCassandra Targett }) 12174e88debSCassandra Targett} 12274e88debSCassandra Targett 12374e88debSCassandra TargettNote the brackets - they are important and prevent accidental 12474e88debSCassandra Targettmistakes of applying the exclusion to the wrong scope. 12574e88debSCassandra Targett 12674e88debSCassandra Targett 12774e88debSCassandra TargettUpdating dependency checksum and licenses 12874e88debSCassandra Targett----------------------------------------- 12974e88debSCassandra Targett 13074e88debSCassandra TargettThe last step is to make sure the licenses, notice files and checksums 13174e88debSCassandra Targettare in place for any new dependencies. This command will print what's 13274e88debSCassandra Targettmissing and where: 13374e88debSCassandra Targett 13474e88debSCassandra Targettgradlew licenses 13574e88debSCassandra Targett 13674e88debSCassandra TargettTo update JAR checksums for licenses use: 13774e88debSCassandra Targett 13874e88debSCassandra Targettgradlew updateLicenses 139