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