xref: /aosp_15_r20/external/dagger2/README.md (revision f585d8a307d0621d6060bd7e80091fdcbf94fe27)
1*f585d8a3SJacky Wang# Dagger
2*f585d8a3SJacky Wang
3*f585d8a3SJacky Wang[![Maven Central][mavenbadge-svg]][mavencentral]
4*f585d8a3SJacky Wang
5*f585d8a3SJacky WangA fast dependency injector for Java and Android.
6*f585d8a3SJacky Wang
7*f585d8a3SJacky WangDagger is a compile-time framework for dependency injection. It uses no
8*f585d8a3SJacky Wangreflection or runtime bytecode generation, does all its analysis at
9*f585d8a3SJacky Wangcompile-time, and generates plain Java source code.
10*f585d8a3SJacky Wang
11*f585d8a3SJacky WangDagger is actively maintained by Google.  Snapshot releases are auto-deployed to
12*f585d8a3SJacky WangSonatype's central Maven repository on every clean build with the version
13*f585d8a3SJacky Wang`HEAD-SNAPSHOT`. The current version builds upon previous work done at [Square][square].
14*f585d8a3SJacky Wang
15*f585d8a3SJacky Wang## Documentation
16*f585d8a3SJacky Wang
17*f585d8a3SJacky WangYou can [find the dagger documentation here][website] which has extended usage
18*f585d8a3SJacky Wanginstructions and other useful information. More detailed information can be
19*f585d8a3SJacky Wangfound in the [API documentation][latestapi].
20*f585d8a3SJacky Wang
21*f585d8a3SJacky WangYou can also learn more from [the original proposal][proposal],
22*f585d8a3SJacky Wang[this talk by Greg Kick][gaktalk], and on the [email protected]
23*f585d8a3SJacky Wangmailing list.
24*f585d8a3SJacky Wang
25*f585d8a3SJacky Wang## Installation
26*f585d8a3SJacky Wang
27*f585d8a3SJacky Wang### Bazel
28*f585d8a3SJacky Wang
29*f585d8a3SJacky WangFirst, import the Dagger repository into your `WORKSPACE` file using
30*f585d8a3SJacky Wang[`http_archive`][bazel-external-deps].
31*f585d8a3SJacky Wang
32*f585d8a3SJacky WangNote: The `http_archive` must point to a tagged release of Dagger, not just any
33*f585d8a3SJacky Wangcommit. The version of the Dagger artifacts will match the version of the tagged
34*f585d8a3SJacky Wangrelease.
35*f585d8a3SJacky Wang
36*f585d8a3SJacky Wang```python
37*f585d8a3SJacky Wang# Top-level WORKSPACE file
38*f585d8a3SJacky Wang
39*f585d8a3SJacky Wangload("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
40*f585d8a3SJacky Wang
41*f585d8a3SJacky WangDAGGER_TAG = "2.50"
42*f585d8a3SJacky WangDAGGER_SHA = "764993ba2465551c181b84b47e467f86fb367d8c0cd50154bd5519a4afb57753"
43*f585d8a3SJacky Wanghttp_archive(
44*f585d8a3SJacky Wang    name = "dagger",
45*f585d8a3SJacky Wang    strip_prefix = "dagger-dagger-%s" % DAGGER_TAG,
46*f585d8a3SJacky Wang    sha256 = DAGGER_SHA,
47*f585d8a3SJacky Wang    urls = ["https://github.com/google/dagger/archive/dagger-%s.zip" % DAGGER_TAG],
48*f585d8a3SJacky Wang)
49*f585d8a3SJacky Wang```
50*f585d8a3SJacky Wang
51*f585d8a3SJacky WangNext you will need to setup targets that export the proper dependencies
52*f585d8a3SJacky Wangand plugins. Follow the sections below to setup the dependencies you need.
53*f585d8a3SJacky Wang
54*f585d8a3SJacky Wang#### Dagger Setup
55*f585d8a3SJacky Wang
56*f585d8a3SJacky WangFirst, load the Dagger artifacts and repositories, and add them to your list of
57*f585d8a3SJacky Wang[`maven_install`] artifacts.
58*f585d8a3SJacky Wang
59*f585d8a3SJacky Wang```python
60*f585d8a3SJacky Wang# Top-level WORKSPACE file
61*f585d8a3SJacky Wang
62*f585d8a3SJacky Wangload("@dagger//:workspace_defs.bzl", "DAGGER_ARTIFACTS", "DAGGER_REPOSITORIES")
63*f585d8a3SJacky Wang
64*f585d8a3SJacky Wangmaven_install(
65*f585d8a3SJacky Wang    artifacts = DAGGER_ARTIFACTS + [...],
66*f585d8a3SJacky Wang    repositories = DAGGER_REPOSITORIES + [...],
67*f585d8a3SJacky Wang)
68*f585d8a3SJacky Wang```
69*f585d8a3SJacky Wang
70*f585d8a3SJacky WangNext, load and call [`dagger_rules`](https://github.com/google/dagger/blob/master/workspace_defs.bzl)
71*f585d8a3SJacky Wangin your top-level `BUILD` file:
72*f585d8a3SJacky Wang
73*f585d8a3SJacky Wang```python
74*f585d8a3SJacky Wang# Top-level BUILD file
75*f585d8a3SJacky Wang
76*f585d8a3SJacky Wangload("@dagger//:workspace_defs.bzl", "dagger_rules")
77*f585d8a3SJacky Wang
78*f585d8a3SJacky Wangdagger_rules()
79*f585d8a3SJacky Wang```
80*f585d8a3SJacky Wang
81*f585d8a3SJacky WangThis will add the following Dagger build targets:
82*f585d8a3SJacky Wang(Note that these targets already export all of the dependencies and processors
83*f585d8a3SJacky Wangthey need).
84*f585d8a3SJacky Wang
85*f585d8a3SJacky Wang```python
86*f585d8a3SJacky Wangdeps = [
87*f585d8a3SJacky Wang    ":dagger",                  # For Dagger
88*f585d8a3SJacky Wang    ":dagger-spi",              # For Dagger SPI
89*f585d8a3SJacky Wang    ":dagger-producers",        # For Dagger Producers
90*f585d8a3SJacky Wang]
91*f585d8a3SJacky Wang```
92*f585d8a3SJacky Wang
93*f585d8a3SJacky Wang#### Dagger Android Setup
94*f585d8a3SJacky Wang
95*f585d8a3SJacky WangFirst, load the Dagger Android artifacts and repositories, and add them to your
96*f585d8a3SJacky Wanglist of [`maven_install`] artifacts.
97*f585d8a3SJacky Wang
98*f585d8a3SJacky Wang```python
99*f585d8a3SJacky Wang# Top-level WORKSPACE file
100*f585d8a3SJacky Wang
101*f585d8a3SJacky Wangload(
102*f585d8a3SJacky Wang    "@dagger//:workspace_defs.bzl",
103*f585d8a3SJacky Wang    "DAGGER_ANDROID_ARTIFACTS",
104*f585d8a3SJacky Wang    "DAGGER_ANDROID_REPOSITORIES"
105*f585d8a3SJacky Wang)
106*f585d8a3SJacky Wang
107*f585d8a3SJacky Wangmaven_install(
108*f585d8a3SJacky Wang    artifacts = DAGGER_ANDROID_ARTIFACTS + [...],
109*f585d8a3SJacky Wang    repositories = DAGGER_ANDROID_REPOSITORIES + [...],
110*f585d8a3SJacky Wang)
111*f585d8a3SJacky Wang```
112*f585d8a3SJacky Wang
113*f585d8a3SJacky WangNext, load and call [`dagger_android_rules`](https://github.com/google/dagger/blob/master/workspace_defs.bzl)
114*f585d8a3SJacky Wangin your top-level `BUILD` file:
115*f585d8a3SJacky Wang
116*f585d8a3SJacky Wang```python
117*f585d8a3SJacky Wang# Top-level BUILD file
118*f585d8a3SJacky Wang
119*f585d8a3SJacky Wangload("@dagger//:workspace_defs.bzl", "dagger_android_rules")
120*f585d8a3SJacky Wang
121*f585d8a3SJacky Wangdagger_android_rules()
122*f585d8a3SJacky Wang```
123*f585d8a3SJacky Wang
124*f585d8a3SJacky WangThis will add the following Dagger Android build targets:
125*f585d8a3SJacky Wang(Note that these targets already export all of the dependencies and processors
126*f585d8a3SJacky Wangthey need).
127*f585d8a3SJacky Wang
128*f585d8a3SJacky Wang```python
129*f585d8a3SJacky Wangdeps = [
130*f585d8a3SJacky Wang    ":dagger-android",          # For Dagger Android
131*f585d8a3SJacky Wang    ":dagger-android-support",  # For Dagger Android (Support)
132*f585d8a3SJacky Wang]
133*f585d8a3SJacky Wang```
134*f585d8a3SJacky Wang
135*f585d8a3SJacky Wang#### Hilt Android Setup
136*f585d8a3SJacky Wang
137*f585d8a3SJacky WangFirst, load the Hilt Android artifacts and repositories, and add them to your
138*f585d8a3SJacky Wanglist of [`maven_install`] artifacts.
139*f585d8a3SJacky Wang
140*f585d8a3SJacky Wang```python
141*f585d8a3SJacky Wang# Top-level WORKSPACE file
142*f585d8a3SJacky Wang
143*f585d8a3SJacky Wangload(
144*f585d8a3SJacky Wang    "@dagger//:workspace_defs.bzl",
145*f585d8a3SJacky Wang    "HILT_ANDROID_ARTIFACTS",
146*f585d8a3SJacky Wang    "HILT_ANDROID_REPOSITORIES"
147*f585d8a3SJacky Wang)
148*f585d8a3SJacky Wang
149*f585d8a3SJacky Wangmaven_install(
150*f585d8a3SJacky Wang    artifacts = HILT_ANDROID_ARTIFACTS + [...],
151*f585d8a3SJacky Wang    repositories = HILT_ANDROID_REPOSITORIES + [...],
152*f585d8a3SJacky Wang)
153*f585d8a3SJacky Wang```
154*f585d8a3SJacky Wang
155*f585d8a3SJacky WangNext, load and call [`hilt_android_rules`](https://github.com/google/dagger/blob/master/workspace_defs.bzl)
156*f585d8a3SJacky Wangin your top-level `BUILD` file:
157*f585d8a3SJacky Wang
158*f585d8a3SJacky Wang```python
159*f585d8a3SJacky Wang# Top-level BUILD file
160*f585d8a3SJacky Wang
161*f585d8a3SJacky Wangload("@dagger//:workspace_defs.bzl", "hilt_android_rules")
162*f585d8a3SJacky Wang
163*f585d8a3SJacky Wanghilt_android_rules()
164*f585d8a3SJacky Wang```
165*f585d8a3SJacky Wang
166*f585d8a3SJacky WangThis will add the following Hilt Android build targets:
167*f585d8a3SJacky Wang(Note that these targets already export all of the dependencies and processors
168*f585d8a3SJacky Wangthey need).
169*f585d8a3SJacky Wang
170*f585d8a3SJacky Wang```python
171*f585d8a3SJacky Wangdeps = [
172*f585d8a3SJacky Wang    ":hilt-android",            # For Hilt Android
173*f585d8a3SJacky Wang    ":hilt-android-testing",    # For Hilt Android Testing
174*f585d8a3SJacky Wang]
175*f585d8a3SJacky Wang```
176*f585d8a3SJacky Wang
177*f585d8a3SJacky Wang### Other build systems
178*f585d8a3SJacky Wang
179*f585d8a3SJacky WangYou will need to include the `dagger-2.x.jar` in your application's runtime.
180*f585d8a3SJacky WangIn order to activate code generation and generate implementations to manage
181*f585d8a3SJacky Wangyour graph you will need to include `dagger-compiler-2.x.jar` in your build
182*f585d8a3SJacky Wangat compile time.
183*f585d8a3SJacky Wang
184*f585d8a3SJacky Wang#### Maven
185*f585d8a3SJacky Wang
186*f585d8a3SJacky WangIn a Maven project, include the `dagger` artifact in the dependencies section
187*f585d8a3SJacky Wangof your `pom.xml` and the `dagger-compiler` artifact as an
188*f585d8a3SJacky Wang`annotationProcessorPaths` value of the `maven-compiler-plugin`:
189*f585d8a3SJacky Wang
190*f585d8a3SJacky Wang```xml
191*f585d8a3SJacky Wang<dependencies>
192*f585d8a3SJacky Wang  <dependency>
193*f585d8a3SJacky Wang    <groupId>com.google.dagger</groupId>
194*f585d8a3SJacky Wang    <artifactId>dagger</artifactId>
195*f585d8a3SJacky Wang    <version>2.x</version>
196*f585d8a3SJacky Wang  </dependency>
197*f585d8a3SJacky Wang</dependencies>
198*f585d8a3SJacky Wang<build>
199*f585d8a3SJacky Wang  <plugins>
200*f585d8a3SJacky Wang    <plugin>
201*f585d8a3SJacky Wang      <groupId>org.apache.maven.plugins</groupId>
202*f585d8a3SJacky Wang      <artifactId>maven-compiler-plugin</artifactId>
203*f585d8a3SJacky Wang      <version>3.6.1</version>
204*f585d8a3SJacky Wang      <configuration>
205*f585d8a3SJacky Wang        <annotationProcessorPaths>
206*f585d8a3SJacky Wang          <path>
207*f585d8a3SJacky Wang            <groupId>com.google.dagger</groupId>
208*f585d8a3SJacky Wang            <artifactId>dagger-compiler</artifactId>
209*f585d8a3SJacky Wang            <version>2.x</version>
210*f585d8a3SJacky Wang          </path>
211*f585d8a3SJacky Wang        </annotationProcessorPaths>
212*f585d8a3SJacky Wang      </configuration>
213*f585d8a3SJacky Wang    </plugin>
214*f585d8a3SJacky Wang  </plugins>
215*f585d8a3SJacky Wang</build>
216*f585d8a3SJacky Wang```
217*f585d8a3SJacky Wang
218*f585d8a3SJacky WangIf you are using a version of the `maven-compiler-plugin` lower than `3.5`, add
219*f585d8a3SJacky Wangthe `dagger-compiler` artifact with the `provided` scope:
220*f585d8a3SJacky Wang
221*f585d8a3SJacky Wang```xml
222*f585d8a3SJacky Wang<dependencies>
223*f585d8a3SJacky Wang  <dependency>
224*f585d8a3SJacky Wang    <groupId>com.google.dagger</groupId>
225*f585d8a3SJacky Wang    <artifactId>dagger</artifactId>
226*f585d8a3SJacky Wang    <version>2.x</version>
227*f585d8a3SJacky Wang  </dependency>
228*f585d8a3SJacky Wang  <dependency>
229*f585d8a3SJacky Wang    <groupId>com.google.dagger</groupId>
230*f585d8a3SJacky Wang    <artifactId>dagger-compiler</artifactId>
231*f585d8a3SJacky Wang    <version>2.x</version>
232*f585d8a3SJacky Wang    <scope>provided</scope>
233*f585d8a3SJacky Wang  </dependency>
234*f585d8a3SJacky Wang</dependencies>
235*f585d8a3SJacky Wang```
236*f585d8a3SJacky Wang
237*f585d8a3SJacky WangIf you use the beta `dagger-producers` extension (which supplies
238*f585d8a3SJacky Wangparallelizable execution graphs), then add this to your maven configuration:
239*f585d8a3SJacky Wang
240*f585d8a3SJacky Wang```xml
241*f585d8a3SJacky Wang<dependencies>
242*f585d8a3SJacky Wang  <dependency>
243*f585d8a3SJacky Wang    <groupId>com.google.dagger</groupId>
244*f585d8a3SJacky Wang    <artifactId>dagger-producers</artifactId>
245*f585d8a3SJacky Wang    <version>2.x</version>
246*f585d8a3SJacky Wang  </dependency>
247*f585d8a3SJacky Wang</dependencies>
248*f585d8a3SJacky Wang```
249*f585d8a3SJacky Wang
250*f585d8a3SJacky Wang#### Gradle
251*f585d8a3SJacky Wang```groovy
252*f585d8a3SJacky Wang// Add Dagger dependencies
253*f585d8a3SJacky Wangdependencies {
254*f585d8a3SJacky Wang  implementation 'com.google.dagger:dagger:2.x'
255*f585d8a3SJacky Wang  annotationProcessor 'com.google.dagger:dagger-compiler:2.x'
256*f585d8a3SJacky Wang}
257*f585d8a3SJacky Wang```
258*f585d8a3SJacky Wang
259*f585d8a3SJacky WangIf you're using classes in `dagger.android` you'll also want to include:
260*f585d8a3SJacky Wang
261*f585d8a3SJacky Wang```groovy
262*f585d8a3SJacky Wangimplementation 'com.google.dagger:dagger-android:2.x'
263*f585d8a3SJacky Wangimplementation 'com.google.dagger:dagger-android-support:2.x' // if you use the support libraries
264*f585d8a3SJacky WangannotationProcessor 'com.google.dagger:dagger-android-processor:2.x'
265*f585d8a3SJacky Wang```
266*f585d8a3SJacky Wang
267*f585d8a3SJacky WangNotes:
268*f585d8a3SJacky Wang
269*f585d8a3SJacky Wang-   We use `implementation` instead of `api` for better compilation performance.
270*f585d8a3SJacky Wang    -   See the [Gradle documentation][gradle-api-implementation] for more
271*f585d8a3SJacky Wang        information on how to select appropriately, and the [Android Gradle
272*f585d8a3SJacky Wang        plugin documentation][gradle-api-implementation-android] for Android
273*f585d8a3SJacky Wang        projects.
274*f585d8a3SJacky Wang-   For Kotlin projects, use [`kapt`] in place of `annotationProcessor`.
275*f585d8a3SJacky Wang
276*f585d8a3SJacky WangIf you're using the [Android Databinding library][databinding], you may want to
277*f585d8a3SJacky Wangincrease the number of errors that `javac` will print. When Dagger prints an
278*f585d8a3SJacky Wangerror, databinding compilation will halt and sometimes print more than 100
279*f585d8a3SJacky Wangerrors, which is the default amount for `javac`. For more information, see
280*f585d8a3SJacky Wang[Issue 306](https://github.com/google/dagger/issues/306).
281*f585d8a3SJacky Wang
282*f585d8a3SJacky Wang```groovy
283*f585d8a3SJacky Wanggradle.projectsEvaluated {
284*f585d8a3SJacky Wang  tasks.withType(JavaCompile) {
285*f585d8a3SJacky Wang    options.compilerArgs << "-Xmaxerrs" << "500" // or whatever number you want
286*f585d8a3SJacky Wang  }
287*f585d8a3SJacky Wang}
288*f585d8a3SJacky Wang```
289*f585d8a3SJacky Wang
290*f585d8a3SJacky Wang### Resources
291*f585d8a3SJacky Wang
292*f585d8a3SJacky Wang*   [Documentation][website]
293*f585d8a3SJacky Wang*   [Javadocs][latestapi]
294*f585d8a3SJacky Wang*   [GitHub Issues]
295*f585d8a3SJacky Wang
296*f585d8a3SJacky Wang
297*f585d8a3SJacky WangIf you do not use maven, gradle, ivy, or other build systems that consume
298*f585d8a3SJacky Wangmaven-style binary artifacts, they can be downloaded directly via the
299*f585d8a3SJacky Wang[Maven Central Repository][mavencentral].
300*f585d8a3SJacky Wang
301*f585d8a3SJacky WangDeveloper snapshots are available from Sonatype's
302*f585d8a3SJacky Wang[snapshot repository][dagger-snap], and are built on a clean build of
303*f585d8a3SJacky Wangthe GitHub project's master branch.
304*f585d8a3SJacky Wang
305*f585d8a3SJacky Wang## Building Dagger
306*f585d8a3SJacky Wang
307*f585d8a3SJacky WangSee [the CONTRIBUTING.md docs][Building Dagger].
308*f585d8a3SJacky Wang
309*f585d8a3SJacky Wang## License
310*f585d8a3SJacky Wang
311*f585d8a3SJacky Wang    Copyright 2012 The Dagger Authors
312*f585d8a3SJacky Wang
313*f585d8a3SJacky Wang    Licensed under the Apache License, Version 2.0 (the "License");
314*f585d8a3SJacky Wang    you may not use this file except in compliance with the License.
315*f585d8a3SJacky Wang    You may obtain a copy of the License at
316*f585d8a3SJacky Wang
317*f585d8a3SJacky Wang       http://www.apache.org/licenses/LICENSE-2.0
318*f585d8a3SJacky Wang
319*f585d8a3SJacky Wang    Unless required by applicable law or agreed to in writing, software
320*f585d8a3SJacky Wang    distributed under the License is distributed on an "AS IS" BASIS,
321*f585d8a3SJacky Wang    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
322*f585d8a3SJacky Wang    See the License for the specific language governing permissions and
323*f585d8a3SJacky Wang    limitations under the License.
324*f585d8a3SJacky Wang
325*f585d8a3SJacky Wang[`bazel`]: https://bazel.build
326*f585d8a3SJacky Wang[bazel-external-deps]: https://docs.bazel.build/versions/master/external.html#depending-on-other-bazel-projects
327*f585d8a3SJacky Wang[`maven_install`]: https://github.com/bazelbuild/rules_jvm_external#exporting-and-consuming-artifacts-from-external-repositories
328*f585d8a3SJacky Wang[Building Dagger]: CONTRIBUTING.md#building-dagger
329*f585d8a3SJacky Wang[dagger-snap]: https://oss.sonatype.org/content/repositories/snapshots/com/google/dagger/
330*f585d8a3SJacky Wang[databinding]: https://developer.android.com/topic/libraries/data-binding/
331*f585d8a3SJacky Wang[gaktalk]: https://www.youtube.com/watch?v=oK_XtfXPkqw
332*f585d8a3SJacky Wang[GitHub Issues]: https://github.com/google/dagger/issues
333*f585d8a3SJacky Wang[gradle-api-implementation]: https://docs.gradle.org/current/userguide/java_library_plugin.html#sec:java_library_separation
334*f585d8a3SJacky Wang[gradle-api-implementation-android]: https://developer.android.com/studio/build/dependencies#dependency_configurations
335*f585d8a3SJacky Wang[`kapt`]: https://kotlinlang.org/docs/reference/kapt.html
336*f585d8a3SJacky Wang[latestapi]: https://dagger.dev/api/latest/
337*f585d8a3SJacky Wang[mavenbadge-svg]: https://maven-badges.herokuapp.com/maven-central/com.google.dagger/dagger/badge.svg
338*f585d8a3SJacky Wang[mavencentral]: https://search.maven.org/artifact/com.google.dagger/dagger
339*f585d8a3SJacky Wang[project]: http://github.com/google/dagger/
340*f585d8a3SJacky Wang[proposal]: https://github.com/square/dagger/issues/366
341*f585d8a3SJacky Wang[square]: http://github.com/square/dagger/
342*f585d8a3SJacky Wang[website]: https://dagger.dev
343