Maven 是 Apache 组织下的一个跨平台的项目管理工具,它主要用来帮助实现项目的构建、测试、打包和部署。
src/main/java 代码
src/main/resources 配置文件
src/test/java 测试代码
src/test/resources 测试代码配置文件
就是在pom.xml中根据一些标签来管理。
<groupId> … </groupId>
<artifactId> … </artifactId>
<version> … </version>
这三个唯一确定一个依赖
<dependencyManagement> … </dependencyManagement>可以管理依赖,当有子工程依赖了父工程时,如果父工程中没有这个标签,那么子工程默认有父工程的全部依赖,如果有则子工程一个父工程的依赖都没有,
因为被管理起来了,如果想要哪些就自己粘过去,因为往往你可能不需要全部的依赖,只是粘过去后,依赖的版本可以省略,因为父工程已经指定了。
我们项目中依赖的 Jar 包可以通过依赖的方式引入,通过在 dependencies 元素下添加 dependency 子元素,可以声明一个或多个依赖。通过控制依赖的范围,可以指定该依赖在什么阶段有效。Maven 的几种依赖范围:
在<scope>标签中:
compile 编译,测试,运行。默认的依赖范围。
test 测试,如 Junit。
runtime 运行,如 JDBC。
provided 编译,测试,如 ServletAPI。
容器或JDK已提供范围,表示该依赖包已经由目标容器(如tomcat)和JDK提供,只在编译的classpath中加载和使用,打包的时候不会包含在目标包中。最常见的是j2ee规范相关的servlet-api和jsp-api等jar包,一般由servlet容器提供,无需在打包到war包中,如果不配置为provided,把这些包打包到工程war包中,在tomcat6以上版本会出现冲突无法正常运行程序(版本不符的情况)。
system 编译,测试,依赖于系统变量。
继承
在面向对象的编程中我们学会了继承的概念,继承是可重用行即消除重复编码的行为。Maven 中继承的用意和面向对象编程中是一致的。与聚合的实现类似,我们通过构建父模块将子模块共用的依赖,插件等进行统一声明,在聚合和继承同时使用时,我们可以用同一个父模块来完成这两个功能。
例如将 com.dugeng.parent 这个模块声明为 project1 和 project2 的父模块,那么我们在 project1 和 2 中用如下代码声明父子关系
继承
<parent>
<groupId>com.dugeng.mavenproject</groupId>
<artifactId>com.dugeng.parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../com.dugeng.parent/pom.xml</relativePath>
</parent>
就是在自己的pom中有一个<parent>即可,而父pom中不需要子pom的相关配置,对比Java对象的继承理解。
依赖是具有传递性的,例如 Project A 依赖于 Project B,B 依赖于 C,那么 B 对 C 的依赖关系也会传递给 A,如果我们不需要这种传递性依赖,也可以用 <optional> 去除这种依赖的传递,如清单 5。
清单 5. 选择性依赖
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
<optional>true<optional>
</dependency>
假设第三方的 jar 包中没有使用 <optional> 来去除某些依赖的传递性,那么可以在当前的 POM 文件中使用 <exclusions> 元素声明排除依赖,exclusions 可以包含一个或者多个 exclusion 子元素,因此可以排除一个或者多个传递性依赖。如清单 6。
清单 6. 排除依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
聚合
现实中一个项目往往是由多个 project 构成的,在进行构建时,我们当然不想针对多个 project 分别执行多次构建命令,这样极容易产生遗漏也会大大降低效率。Maven 的聚合功能可以通过一个父模块将所有的要构建模块整合起来,将父模块的打包类型声明为 POM,通过 <modules> 将各模块集中到父 POM 中。如清单 7,其中 <module></module> 中间的内容为子模块工程名的相对路径。
清单 7. 聚合 controller --> service --> dao --> pojo 这个就是我们在代码中的依赖关系,在controller注入service,service中注入dao,而dao有需要pojo中的属性值来与数据库交互
<modules>
<module>../com.dugeng.project1</module>
<module>../com.dugeng.project2</module>
</modules>
父类型的模块,不需要有源代码和资源文件,也就是说,没有 src/main/java 和 src/test/java 目录。Maven 会首先解析聚合模块的 POM 文件,分析要构建的模块,并通过各模块的依赖关系计算出模块的执行顺序,根据这个潜在的关系依次构建模块。将各子模块聚合到父模块中后,我们就可以对父模块进行一次构建命令来完成全部模块的构建。
Maven 的 setting.xml
<localRepository>E:\0808\repository</localRepository> jar包下载到哪里(本地仓库)
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror> 从哪里下载jar(私服或中央仓库)
tomcat插件:
<build>
<plugins>
<!-- 配置Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<port>8082</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
插一句:聚合工程在聚合之后运行,所以聚合工程的tomcat插件一定是在父工程的pom中配置。
打包 clean package
创建Maven项目时,pom类型的Maven项目有两种,一是作为聚合工程的父工程,还有就是做为专门管理依赖的pom。
jar类型的Maven项目就是像那些工具类似的,放的都是各个工程共用的东西,然后被那些war类型的Maven工程依赖即可,
war类型的Maven项目就是我们理解纯粹的web工程了,接收用户请求到controller --> service --> dao ,然后响应
因为网络等原因jar包下载下来只有1K,这是可以Maven Update重新下载没有成功的jar
清单8 tomcat热部署
1>添加tomcat用户,tomcat在conf/tomcat-user.xml文件下添加一个tomcat用户
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<user username="tomcat" password="123456" roles="manager-gui, manager-script"/>
2>修改pom中tomcat插件
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<url>http://localhost:8080/manager/text</url>
<username>tomcat</username>
<password>123456</password>
</configuration>
</plugin>
3> run as
tomcat7:deploy
项目已有 重发布 tomcat7:redeploy