要点

  • maven默认的目录结构
  • 源码:src/main/java
  • 编译输出目录为 target/classes/
  • 打包方式为jar
  • 包输出目录为target
  • scope
  • 指定依赖范围,如果为test,只在测试单元中生效。
  • 默认是compile
  • build中添加maven-compiler-plugin
  • 因为历史原因,compiler只能支持到1.3,所以要配置
  • 进行编译测试以后,就可以进行打包,使用maven clean package就可以了。
  • 一个project中有多个module,或者多个项目。执行mvn clean install就会将你的包打到~/.m2/repository中,供本地其他的项目使用。而mvn clean deploy 会将你的jar包打包到远程仓库中
  • 如果想让你的jar包中某个类的main函数可用,就需要再添加一个plugin : maven-shade-plugin。这样在打的jar中的META-INF/MANIFEST.MF 中就可以看到Main-Class: com.taobao.maven.example.HelloWorld
  • 依赖范围:
  • 控制依赖与三种classpath(编译classpath、测试classpath、运行classpath)之间的关系
  • 而maven有以下几种依赖范围
  • compile:默认情况下使用;三种都有效
  • test:只对测试classpath有效
  • provided:已提供依赖范围。只对编译和测试两种classpath有效。例如:servlet-api,在运行时不需要引入,因为容器已经提供了。
  • runtime:运行时依赖范围。对于测试和运行有效。例如JDBC驱动的实现。
  • system:和provided一样。但其路径是要显示指定本地的路径。不通过maven来拉取jar包。因此可能造成系统不可移植。慎用。
  • import:对以上三种都不产生影响。
  • 路径最近者优先 和 第一声明者优先
  • mvn dependency:
  • mvn dependency:list,将依赖以列表的形式展现出来
  • mvn dependency:tree, 将依赖以树的形式展现出来
  • mvn dependency: analyze, 分析依赖数,如果是间接引入会提示,如果有显示引入但是没有用到也会提示(但这种提示不准确,要小心删除)
  • 本地仓库
  • 当执行编译和测试的时候,从本地仓库获取依赖文件。
  • 默认情况下都在用户自己的目录下有: ~/m2/repository
  • 如果要修改自己的目录,就要在~/m2/setting.xml中修改来定义。默认情况下是没有了,需要从maven安装目录中拷贝该文件。
  • 超级pom文件
  • central
  • 指定从哪个中央仓库中下载所需要的jar包,一般指定为公司内部的地址

  • 指定将本地的包打包到哪个远程仓库中,一般也指定为公司内部地址
  • maven生命周期
  • 三套相互独立的生命周期,clean(清理项目)、default(构建项目)、site(建立项目站点)
  • clean
  • pre-clean
  • clean
  • post-clean
  • default (定义了真正构建时所需要执行的所有步骤)
  • validate
  • initialize
  • generate-sources
  • process-sources(对resources目录中的内容变量进行替换)
  • generate-resources
  • process-resources
  • compile (编译代码)
  • process-classes
  • generate-test-sources
  • process-test-sources (对test下的resources内容进行变量替换)
  • generate-test-resources
  • process-test-resources
  • test-compile (编译测试代码)
  • process-test-classes
  • test (运行测试单元进行测试)
  • prepare-package
  • package
  • pre-integration0test
  • integration-test
  • post-integration-test
  • verify
  • install (将包安装到maven本地仓库)
  • deploy (将包推送到远程仓库中)
  • site
  • 聚合
  • 多个module之间要相互合作,就需要类似d4s那样,建立一个根目录,然后下面是各个module模块,模块中再有自己的src/java/main等目录。
  • 这事就要有pom存在,这里必须为pom,否则默认就是jar,这样会编译失败。还要指定子模块都有哪些d4s-client等。
  • d4s目录和d4s-client目录,可以是父子关系,也可以是平行的目录结构。
  • 如果是这样的话,就需要使用../d4s-client,其实理解成文件的访问就好了。
  • 继承
  • 由于每个模块都有自己的jar包,也有自己的build,这样就会造成大量的重复,为了避免这种情况的出现,就可以使用parent包,来汇总。例如d4s-parent。
  • parent里面的pom也要使用pom
  • 该目录下只有pom.xml文件
  • 在中,一定要设置, 这样才能正确的找到父亲pom的位置。否则默认情况就是../pom.xml。(除非没有建立专门的父pom.xml文件,使用顶层的pom文件作为父pom)
  • 使用继承带来的另一种效果是,子模块可以继承父pom的groupId和version。也可以显示的自己随便定义。
  • 依赖管理
  • 如果某一个模块当中要引入特定的jar包,但是其他模块中是不会使用的。需要在父pom.xml中使用,来管理各种依赖。那么在子pom中,指定了哪些jar包,才能引入,没有指定的话,就不会被引入。
  • dwork-web目录
  • 除了基本的src/main/java 和 src/main/resources以及相应的测试目录以外,还有一个web资源目录,src/main/webapp/
  • project
  • pom.xml
  • src/
  • main
  • java/
  • *.java
  • resources/
  • config.properties
  • webapp
  • WEB-INF/
  • web.xml
  • img/
  • css/
  • js/
  • index.html
  • sample.jsp
  • test
  • java
  • resources
  • web目录中的pom
  • 引入serlet-api 和 jsp-api,但其scope要是provide,最后不会打包到war文件中,因为web容器中都会提供这两种类库。
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
</dependency>
  • 可以通过 name 来指定最后生成的war包名称为 name.war
  • web.xml配置
<listener>
    // 用来为WEB项目启动Spring的ioc容器,从而实现bean的注入
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>