pom文件详解
父级常用POM
<!-- 声明项目描述符遵循哪一个POM模型版本。模型本身的版本很少改变,虽然如此,但它仍然是必不可少的, 这是为了当Maven引入了新的特性或者其他模型变更的时候,确保稳定性。 --> <modelVersion> 4.0.0 </modelVersion>
<!-- 项目的全球唯一标识符,通常使用全限定的包名区分该项目和其他项目。并且构建时生成的路径也是由此生成, 如com.mycompany.app生成的相对路径为:/com/mycompany/app --> <groupId>xxx</groupId> <!-- 构件的标识符,它和group ID一起唯一标识一个构件。换句话说,你不能有两个不同的项目拥有同样的artifact ID和groupID;在某个特定的group ID下,artifact ID也必须是唯一的。通常和项目名称保持统一 --> <artifactId>xxx</artifactId> <!-- 项目产生的构件类型,例如jar、war、ear、pom。插件可以创建他们自己的构件类型,默认jar--> <packaging> jar </packaging> <!-- 项目当前版本,格式为:主版本.次版本.增量版本-限定版本号 --> <version> 1.0-SNAPSHOT </version>
<!-- 发现依赖和扩展的远程仓库列表。下面的是阿里云的镜像仓库 --> <repositories> <repository> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> </repository> </repositories>
<!-- 模块(有时称作子项目) 被构建成项目的一部分。列出的每个模块元素是指向该模块的目录的相对路径 --> <modules> <!--子项目相对路径--> <module></module> </modules>
<!-- 以值替代名称,Properties可以在整个POM中使用--> <properties> <!-- 定义 java.version 1.8--> <java.version>1.8</java.version> <!-- 使用 ${java.version}--> <maven.compiler.source>${java.version}</maven.compiler.source> </properties>
<!-- profile可以让我们定义一系列的配置信息,然后指定其激活条件,指定activeByDefault为true的时候就表示当没有指定其他profile为激活状态时,该profile就默认会被激活 --> <!--通常用profile来动态的选择配置文件,即多个部署环境 --> <!-- 示例代码就展示了3种环境,本地开发环境,生产环境,测试环境,部署打包的时候制定不同的profile就可以 --> <profiles> <profile> <id>dev</id> <properties> <activeProfile>dev</activeProfile> </properties> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> <profile> <id>pro</id> <properties> <activeProfile>pro</activeProfile> </properties> </profile> <profile> <id>test</id> <properties> <activeProfile>test</activeProfile> </properties> </profile> </profiles>
<!-- 一般在最顶层的pom文件里,主要用来统一管理项目依赖的版本号,确保应用的各个项目的依赖和版本一致 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <!-- 使用上文设置的properties --> <version>${spring.boot.version}</version> </dependency> </dependencies> </dependencyManagement> <!-- 依赖具体的jar包 --> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <!-- 如果不设置version,就会父级pom中dependencyManagement找,继承父级的 version 。如果设置了就用自己设置的版本--> [<version>${spring.boot.version}</version>] </dependency> </dependencies>
<!-- 构建项目需要的信息,主要用于编译设置 --> <build> <!-- 使用的插件列表 --> <plugins> <!-- plugin元素包含描述插件所需要的信息 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>3.0.2</version> <configuration> <encoding>UTF-8</encoding> </configuration> </plugin> <!-- 指定maven编译的jdk版本,如果不指定,maven3默认用jdk 1.5 maven2默认用jdk1.3 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.7.0</version> <configuration> <source>${maven.compiler.source}</source> <target>${maven.compiler.target}</target> <encoding>utf-8</encoding> <compilerArgument>-XDignore.symbol.file</compilerArgument> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.20</version> <configuration> <skip>true</skip> </configuration> </plugin> </plugins> </build>
<resources> <!-- 这个元素描述了项目相关或测试相关的所有资源路径 --> <resource> <!-- 描述了资源的目标路径。该路径相对target/classes目录(例如${project.build.outputDirectory})。 举个例子,如果你想资源在特定的包里(org.apache.maven.messages),你就必须该元素设置为 org/apache/maven/messages。然而,如果你只是想把资源放到源码目录结构里,就不需要该配置。 --> <targetPath></targetPath> <!-- 是否使用参数值代替参数名。参数值取自properties元素或者文件里配置的属性,文件在filters元素 里列出。 --> <filtering></filtering> <!-- 描述存放资源的目录,该路径相对POM路径 --> <directory></directory> <!-- 包含的模式列表,例如**/*.xml. --> <includes> <include></include> </includes> <!-- 排除的模式列表,例如**/*.xml --> <excludes> <exclude></exclude> </excludes> </resource> </resources>
众所周知,pom.xml文件是maven工程的核心文件,是全局级别的配置文件;可以在该文件中添加jar包的依赖,使用plugin来配置一些规则;在执行task或goal时,maven会去项目根目录下读取pom.xml文件获取需要的配置信息。总而言之,了解pom文件里面的概念是很有必要的。
maven内置属性(maven预定义,用户可以直接使用)
${basedir}表示项目根目录,既包含pom.xml文件的目录
${version}表示项目版本
${project.basedir},同${basedir}
${project.baseuri}表示项目文件地址
${maven.build.timestamp}表示项目构件开始时间
${maven.build.timestamp.format}表示属性${maven.build.timestamp}的展示格式,默认值为yyyyMMdd-HHmm,可以自定义其格式。用法如下:
扩展:指定生成的jar包文件名并带时间戳
properties:通过<properties>元素,用户可以定义一个或多个maven属性,这样就可以在pom的其他地方使用${属性名}的方式引用该属性。
Maven总共有6类属性,内置属性、POM属性、自定义属性、Settings属性、Java属性。
内置属性:
两个常用内置属性 ${basedir} 表示项目跟目录,即包含pom.xml文件的目录;${version} 表示项目版本
pom属性:
用户可以使用该类属性引用POM文件中对应元素的值。如${project.artifactId}就对应了<project> <artifactId>元素的值,常用的POM属性包括:
${project.build.sourceDirectory}:项目的主源码目录,默认为src/main/java/
${project.build.testSourceDirectory}:项目的测试源码目录,默认为src/test/java/
${project.build.directory} : 项目构建输出目录,默认为target/
${project.outputDirectory} : 项目主代码编译输出目录,默认为target/classes/
${project.testOutputDirectory}:项目测试主代码输出目录,默认为target/testclasses/
${project.groupId}:项目的groupId
${project.artifactId}:项目的artifactId
${project.version}:项目的version,与${version} 等价
${project.build.finalName}:项目打包输出文件的名称,默认为${project.artifactId}-${project.version}