pom.xml详解撸一下基础
Posted 月疯
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pom.xml详解撸一下基础相关的知识,希望对你有一定的参考价值。
pom.xml解释
<?xml version="1.0" encoding="UTF-8"?>
<!--project 标签:根标签,表示对当前工程进行配置、管理-->
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!--modelVersion 标签:从Maven2开始就固定是4.0.0-->
<!--代表当前pom.xml所采用的标签结构-->
<modelVersion>4.0.0</modelVersion>
<!--坐标信息-->
<!--在本地仓库中安装后对应的路径:com\\seer\\maven\\seer-heathy-demo\\1.0-SNAPSHOT\\seer-heathy-demo-1.0-SNAPSHOT.jar-->
<!--groupId 标签:坐标向量之一;代表公司或组织开发的某一个项目-->
<groupId>com.seer.maven</groupId>
<!--artifactId 标签:坐标向量之一;代表项目下的某一个模块-->
<artifactId>seer-heathy-demo</artifactId>
<!--version 标签:坐标向量之一;代表当前模块的版本-->
<version>1.0-SNAPSHOT</version>
<!--packaging 标签:打包方式-->
<!--取值jar:生成jar包,说明这是一个Java工程-->
<!--取值war:生成war包,说明这是一个Web工程-->
<!--取值pom:说明这个工程是用来管理其他工程的工程-->
<packaging>jar</packaging>
<name>seer-heathy-demo</name>
<url>http://maven.apache.org</url>
<!--在Maven中定义属性值-->
<properties>
<!--在构建过程中读取源码时使用的字符集-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!--dependencies标签:配置具体依赖信息,可以包含多个dependency子标签-->
<dependencies>
<!--dependency 标签:配置一个具体的依赖信息-->
<dependency>
<!--坐标信息:导入那个jar包,就配置它的坐标信息即可-->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<!--scope标签:配置当前依赖的范围-->
<scope>test</scope>
</dependency>
</dependencies>
</project>
创建java版的maven工程
1、Maven中的坐标
groupId:公司或组织的id
artifactId:一个项目或者是项目中的一个模块的id
version:版本号
groudid:公司或组织域名的倒序,通常也会加上项目名称
列如:com.seer.maven
artifactid:模块的名称,将来作为Maven工程的工程名
version:模块的版本号,根据自己的需要的设定
列如:SNAPSHOT表示快照版本,正在迭代过程中,不稳定版本
列如:RELEASE表示正式版本
坐标和仓库中的jar包的存储路径之间的对应关系
坐标:
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5<version>
上面坐标对应jar在Maven本地仓库中的位置:
Maven本地仓库根目录\\javax\\servlet\\servlet-api\\2.5\\servlet-api-2.5.jar
使用maven命令生成Maven工程
运行 mvn archetype:generate 命令
POM:projectObjectModel,项目对象模型。和POM类似的是:DOM(Doucument Object Model),文档对象模型。他们都是模型化思想的具体实现。
开发领域的技术发展趋势就是:约定大于配置,配置大于编码
Maven执行构建命令
1、mvn -v命令和构建操作无关,只要正确配置了PATH,在任何目录下都可以执行。
2、清理操作
mvn clean
效果:删除target目录
3、编译操作
主程序编译:mvn compile
测试程序编译:mvn test-compile
主体程序编译结果存放的目录:target/classes
测试程序编译结果存放的目录:target/test-classes
4、测试操作
mvn test
测试报告存放的目录:target/surefire-reports
5、打包操作
mvn package
打包结果--jar包,存放的目录:target
6、安装操作
mvn install
安装的效果是将本地构建过程中生成的jar包存入Maven本地仓库。这个jar包在Maven仓库中的路径是根据它的坐标生成的。
坐标:
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5<version>
上面坐标对应jar在Maven本地仓库中的位置:
Maven本地仓库根目录D:\\maven-repo\\javax\\servlet\\servlet-api\\2.5\\servlet-api-2.5.jar
另外,安装操作还会降pom.xml文件转换为XXX.pom文件一起存入本地仓库。所以我们在maven的本地仓库想看一个jar包原始的pom.xml文件时,查看对应的XXX.pom文件即可,他们是名字发生改变,本质上是同一个文件。
创建web版的maven工程
参数archetpeGroupId、archetypeArtifactId、archetypeVersion用来指定现在使用的maven-archetype-webapp的坐标
在一个工作空间根目录来操作,不能在一个非pom的工程下在创建其他工程。
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DarchetypeVersion=1.4
测试依赖范围:
标签的位置:dependencies/dependency/scope
标签的可选值:compile/test/provided/system/runtime/import
compile:解释
provided:已提供
<!--dependency 标签:配置一个具体的依赖信息-->
<dependency>
<!--坐标信息:导入那个jar包,就配置它的坐标信息即可-->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<!--scope标签:配置当前依赖的范围-->
<scope>test</scope>
</dependency>
<dependency>
<!--坐标信息:导入那个jar包,就配置它的坐标信息即可-->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<!--scope标签:配置当前依赖的范围-->
<!--表示会被大金war包-->
<scope>compile</scope>
</dependency>
<dependency>
<!--坐标信息:导入那个jar包,就配置它的坐标信息即可-->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<!--scope标签:配置当前依赖的范围-->
<!--表示已提供的,war包里面不会被打包进去-->
<scope>provided</scope>
</dependency>
结论:
compile:通常使用的第三方的框架jar包这样在项目实际运行时真正要用到的jar包都是以compile范围进行依赖,比如SSM框架所需要的jar包
test:测试过程中使用的jar包,以test范围依赖过来,比如junit。
provided:在开发过程中需要用到的“服务器上的jar包”通常provided范围依赖进来。比如servlet-api、jsp-api。而这些范围的jar包之所以不参与部署、不放进war包,就是避免和服务器上已有的同类jar包产生冲突,同时减轻服务器的负担。说白了就是“服务器上已经有了,你就别带了”
排除依赖:设置方式
<dependency>
<groupId>com.atguigu.maven</groupId>
<artifactId>pro01-maven-java</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
<!--使用excludes标签配置依赖的排除-->
<exclusions>
<!--在exclude标签中配置一个具体的排除-->
<exclusion>
<!--指定要排除的依赖坐标(不需要写version)-->
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
在dependency元素中除了可以指定依赖项目的groupId、artifactId和version之外,还可以指定以下元素:
type:对应于依赖项目的packaging类型,默认是jar
scope:表示依赖项目的一个作用范围。scope的主要取值范围如下(还有一个是在Maven2.0.9以后版本才支持的import,关于import作用域将在后文《Dependency介绍》中做介绍):
compile:这是它的默认值,这种类型很容易让人产生误解,以为只有在编译的时候才是需要的,其实这种类型表示所有的情况都是有用的,包括编译和运行时。而且这种类型的依赖性是可以传递的。
provided:这个跟compile很类似,但是它表示你期望这个依赖项目在运行时由JDK或者容器来提供。这种类型表示该依赖只有在测试和编译的情况下才有效,在运行时将由JDK或者容器提供。这种类型的依赖性是不可传递的。
runtime:这种类型表示该依赖在编译的时候不是必须的,只有在运行的时候才是必须的。
test:这表示这种依赖只有测试的时候才需要,正常情况下是不需要的。
system:这种类型跟provided类似,唯一不同的就是这种类型的依赖我们要自己提供jar包,这需要与另一个元素systemPath来结合使用。systemPath将指向我们系统上的jar包的路径,而且必须是给定的绝对路径。
systemPath:上面已经说过了这个元素是在scope的值为system的时候用于指定依赖的jar包在系统上的位置的,而且是绝对路径。该元素必须在依赖的 jar包的scope为system时才能使用,否则Maven将报错。
optional:当该项目本身作为其他项目的一个依赖时标记该依赖为可选项。假设现在projectA有一个依赖性projectB,我们把projectB这个依赖项设为optional,这表示projectB在projectA的运行时不一定会用到。这个时候如果我们有另一个项目projectC,它依赖于projectA,那么这个时候因为projectB对于projectA是可选的,所以Maven在建立projectC的时候就不会安装projectB,这个时候如果projectC确实需要使用到projectB,那么它就可以定义自己对projectB的依赖。当一个依赖是可选的时候,我们把optional元素的值设为true,否则就不设置optional元素。
exclusions:考虑这样一种情况,我们的projectA依赖于projectB,然后projectB又依赖于projectC,但是在projectA里面我们不需要projectB依赖的projectC,那么这个时候我们就可以在依赖projectB的时候使用exclusions元素下面的exclusion排除projectC。
属性:
在pom.xml文件中我们可以使用$propertyName的形式引用属性。这个propertyName有以下几种形式:
env.propertyName:这种形式表示引用的是环境变量,比如我们需要引用当前系统的环境变量PATH的时候,就可以使用$env.PATH。
project.propertyName:这种形式表示引用的是当前这个pom.xml中project根元素下面的子元素的值。比如我们需要引用当前project下面的version的时候,就可以使用$project.version。
settings.propertyName:这种形式引用的是Maven本地配置文件settings.xml或本地Maven安装目录下的settings.xml文件根元素settings下的元素。比如我们需要引用settings下的本地仓库localRepository元素的值时,我们可以用$settings.localRepository
java的系统属性,所有在java中使用java.lang.System.getProperties()能够获取到的属性都可以在pom.xml中引用,比如$java.home。
pom.xml中properties元素下面的子元素作为属性。假如在pom.xml中有如下一段代码<properties><hello.world>helloWorld</hello.world></properties>,那么我们就可以使用$hello.world引用到对应的helloWorld。
以上是关于pom.xml详解撸一下基础的主要内容,如果未能解决你的问题,请参考以下文章