Maven坐标
- 一个完整的坐标信息,由 groupId、artifactId、version、packaging、classifier 组成,如下是一个简单的坐标定义。
<groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.2.3</version> <packaging>jar</packaging>
- groupid:定义当前 Maven 项目从属的实际项目
- artifactId:定义实际项目中的一个 Maven 项目(实际项目中的一个模块),比如,org.springframework 是实际项目名称,而现在用的是其中的核心模块,它的 artifactId 为 spring-core。
- version:版本信息
- packaging:打包方式,上面的打包方式为jar包
Maven依赖
- maven依赖,pom.xml表示为,根据坐标从仓库中找到对应的包,然后引入到maven项目中来。
- 配置代码
<project> ... <dependencies> <dependency> <!--基本坐标,用来从仓库中找到包--> <groupId>...</groupId> <artifactId> ... </artifactId> <version>...</version> <!--依赖的属性配置--> <type>...</type> <scope>...</scope> <optional>...</optional> <exclusions> <exclusion>...</exclusion> </exclusions> </dependency> ... </dependencies> ... </project>
依赖的范围scope
- maven与JVM编译一样
- 在编译项目主代码的时候,使用一套classpath来对代码进行编译
- 在测试代码编译和执行时,使用另外一套classpath来对diam进行编译
- 在运行代码的时候,又有一套独立的classpath
- 依赖的范围目的:在于确定引入的依赖到底是执行在哪个范围,哪个阶段可以进行使用
- 类型
- complie
- 编译依赖范围。如果在配置的时候没有指定,就默认使用这个范围。使用该范围的依赖,对编译、测试、运行三种 classpath 都有效
- test
- 测试依赖范围。使用该范围的依赖只对测试 classpath 有效,在编译主代码或运行项目的时候,这种依赖是无效的。
- provided
- 已提供依赖范围。使用此范围的依赖,只在编译和测试 classpath 的时候有效,运行项目的时候是无效的。比如 Web 应用中的 servlet-api,编译和测试的时候就需要该依赖,运行的时候,因为容器中自带了 servlet-api,就没必要使用了。如果使用了,反而有可能出现版本不一致的冲突。
- runtime
- 运行时依赖范围。使用该范围的依赖,只对测试和运行的 classpath 有效,但在编译主代码时是无效的。比如 JDBC 驱动实现类,就需要在运行测试和运行主代码时候使用,编译的时候,只需 JDBC 接口就行。
- system
- 系统依赖范围。该范围与 classpath 的关系,同 provided 一样。但是,使用 system 访问时,必须通过 systemPath 元素指定依赖文件的路径。因为该依赖不是通过 Maven 仓库解析的,建议谨慎使用。
- import
- 导入依赖范围。该依赖范围不会对三种 classpath 产生实际的影响。它的作用是将其他模块定义好的 dependencyManagement 导入当前 Maven 项目 pom 的 dependencyManagement 中。比如有个 SpringPOM Maven 工程,它的 pom 中的 dependencyManagement 配置如下:
<project> ... <groupId>cn.com.mvn.pom</groupId> <artifactId>SpringPOM</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> ... <dependencyManagement> <dependencies> <!-- spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${project.build.spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${project.build.spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${project.build.spring.version}</version> </dependency> </dependencies> </dependencyManagement> ... </project>
- 接下来创建一个新的 Maven 工程 Second,要将 First 工程中 pom 中定义的 dependency-Management 原样合并过来,除了复制、继承之外,还可以编写如下代码,将它们导入进去。
<dependencyManagement> <dependencies> <dependency> <groupId>cn.com.mvn.pom</groupId> <artifactId>SpringPOM</artifactId> <version>0.0.1-SNAPSHOT</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
- complie
Profile的配置
- 目的:为了实现不同环境构建的不同需求(最近项目中使用的方式),profile能够在构建时修改pom的一个子集,或者添加额外的配置元素。
- 代码:配置了连个profile,那么如何激活呢,或者是使用呢???
<profiles> <profile> <id>dev_evn</id> <properties> <db.driver>com.mysql.jdbc.Driver</db.driver> <db.url>jdbc:mysql://localhost:3306/test</db.url> <db.username>root</db.username> <db.password>root</db.password> </properties> </profile> <profile> <id>test_evn</id> <properties> <db.driver>com.mysql.jdbc.Driver</db.driver> <db.url>jdbc:mysql://localhost:3306/test_db</db.url> <db.username>root</db.username> <db.password>root</db.password> </properties> </profile> </profiles>
- 激活方法
- 命令行激活:在 mvn 命令行中添加参数“-P”,指定要激活的 profile 的 id。如果一次要激活多个 profile,可以用逗号分开一起激活。例如:
mvn clean install -Pdev_env,test_evn
- Settings文件显示激活:希望某个 profile 默认一直处于激活状态,可以在 settings.xml 中配置 activeProfiles 元素,指定某个 profile 为默认激活状态,样例配置代码如下:
<settings> ... <activeProfiles> <activeProfile>dev_evn</activeProfile> </activeProfiles> ... </settings>
- 系统属性激活
//表示当存在profileProperty属性时激活 <profiles> <profile> ... <activation> <property> <name>profileProperty</name> </property> </activation> </profile> </profiles>
- 甚至还可以进一步配置某个属性的值是什么时候激活,例如
<profiles> <profile> ... <activation> <property> <name>profileProperty</name> <value>dev</value> </property> </activation> </profile> </profiles>
- 在 mvn 中用“-D”参数来指定激活,例如:表示激活属性名称为profileProperty,值为dev的profile,实质上,此处也是一种命令激活profile的方法,只是用的是-D参数指定激活的属性和值,而前面使用的是-P参数指定激活的profile的id而已
mvn clean install -DprofileProperty=dev
- 文件存在与否激活:通过配置判断某个文件存在与否来决定是否激活 profile
<profiles> <profile> <activation> <file> <missing>t1.properties</missing> <exists>t2.properties</exists> </file> </activation> </profile> </profiles>
- 默认激活:如果 pom 中有任何一个 profile 通过其他方式被激活的话,所有配置成默认激活的 profile 都会自动失效。
<profiles> <profile> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> </profiles>
- 可以使用如下命令查看当前激活的 profile。
或者mvn help:active-profiles
mvn help:all-profiles
- 命令行激活:在 mvn 命令行中添加参数“-P”,指定要激活的 profile 的 id。如果一次要激活多个 profile,可以用逗号分开一起激活。例如:
问题点
- 当存在多个默认的激活profile时,是什么情况
- 案例:通过不同的profile激活,查看依赖包的引用情况,没有激活的任何配置,所以应该是使用所有的默认激活profile
- 案例:通过不同的profile激活,查看依赖包的引用情况,没有激活的任何配置,所以应该是使用所有的默认激活profile