xref: /Lucene/help/dependencies.txt (revision 1679076bdef9142ba21000227115533b7517791b)
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