A fast dependency injector for Android and Java.
Dagger 2 - User's Guide
GitHub - Dagger 2
git clone https://github.com/google/dagger.git
cd dagger
//构建项目,需要指定Android sdk目录
mvn package -Dandroid.sdk.path=/Users/shenyunlong/Library/Android/sdk/
// 运行coffee example demo
// 运行时依赖javax.inject-1.jar和dagger-2.5-SNAPSHOT.jar
java -cp examples/simple/target/simple-2.5-SNAPSHOT.jar:examples/simple/target/javax.inject-1.jar:core/target/dagger-2.5-SNAPSHOT.jar coffee.CoffeeApp
关于Maven
Maven 是一个项目管理和构建自动化工具。
一个 maven 项目在默认情况下会产生 JAR 文件,另外 ,编译后 的 classes 会放在 ${basedir}/target/classes 下面, JAR 文件会放在 ${basedir}/target 下面。
// Mac上通过brew安装maven
brew install maven
// 检查是否安装成功
mvn -v
...
// 构建maven项目
mvn package
// 运行
java -cp target/helloworld-1.0-SNAPSHOT.jar com.mycompany.helloworld.App
当你第一次运行 maven 的时候,它会从网上的 maven 库 (repository) 下载需要的程序,存放在你电脑的本地库 (local repository) 中,所以这个时候你需要有 Internet 连接。Maven 默认的本地库是 ~/.m2/repository/ ,在 Windows 下是 %USER_HOME%.m2\repository\ 。
-
POM (Project Object Model)
一个项目所有的配置都放置在 POM 文件中:定义项目的类型、名字,管理依赖关系,定制插件的行为等等。
在 POM 中,groupId,artifactId,packaging,version叫作 maven 坐标,它能唯一的确定一个项目。有了 maven 坐标,我们就可以用它来指定我们的项目所依赖的其他项目,插件,或者父项目。一般 maven 坐标写成如下的格式:
groupId:artifactId:packaging:version
像我们的例子就会写成:
com.mycompany.helloworld: helloworld: jar: 1.0-SNAPSHOT
Maven 插件
pluginId:goalId
mvn 本身不会做太多的事情,它不知道怎么样编译或者怎么样打包。它把构建的任务交给插件去做。插件定义了常用的构建逻辑,能够被重复利用。Maven 生命周期
mvn package这里的 package 是一个maven的生命周期阶段 (lifecycle phase )。生命周期指项目的构建过程,它包含了一系列的有序的阶段 (phase),而一个阶段就是构建过程中的一个步骤。
maven 能支持不同的生命周期,但是最常用的是默认的Maven生命周期 (default Maven lifecycle )。如果你没有对它进行任何的插件配置或者定制的话,那么上面的命令 mvn package 会依次执行默认生命周期中直到包括 package 阶段前的所有阶段的插件目标:
process-resources 阶段:resources:resources
compile 阶段:compiler:compile
process-classes 阶段:(默认无目标)
process-test-resources 阶段:resources:testResources
test-compile 阶段:compiler:testCompile
test 阶段:surefire:test
prepare-package 阶段:(默认无目标)
package 阶段:jar:jar
Maven 依赖管理
在 POM 的 dependencies 部分中,scope 决定了依赖关系的适用范围。我们的例子中 junit 的 scope 是test,那么它只会在执行 compiler:testCompile and surefire:test 目标的时候才会被加到 classpath 中,在执行 compiler:compile 目标时是拿不到 junit 的。
我们还可以指定 scope 为provided,意思是 JDK 或者容器会提供所需的jar文件。比如说在做web应用开发的时候,我们在编译的时候需要 servlet API jar 文件,但是在打包的时候不需要把这个 jar 文件打在 WAR 中,因为servlet容器或者应用服务器会提供的。
scope 的默认值是compile,即任何时候都会被包含在 classpath 中,在打包的时候也会被包括进去。Maven库
当第一次运行 maven 命令的时候,你需要 Internet 连接,因为它要从网上下载一些文件。那么它从哪里下载呢?它是从 maven 默认的远程库(http://repo1.maven.org/maven2) 下载的。这个远程库有 maven 的核心插件和可供下载的 jar 文件。
本地库是指 maven 下载了插件或者 jar 文件后存放在本地机器上的拷贝。在 Linux 上,它的位置在~/.m2/repository,在 Windows XP 上,在C:\Documents and Settings\username\.m2\repository,在 Windows 7 上,在C:\Users\username\.m2\repository。当 maven 查找需要的 jar 文件时,它会先在本地库中寻找,只有在找不到的情况下,才会去远程库中找。
运行下面的命令能把我们的 helloworld 项目安装到本地库:
mvn install