MAVEN 属性

MAVEN pom文件中可以使用 ${} 引用键值对属性,MAVEN的属性主要包括以下几类

  • 内置属性
  • XML标签属性
    • pom.xml 标签属性
    • settings.xml 标签属性
  • 环境变量属性
    • Java系统属性,通过JAVA代码 System.getProperties() 获得的所有属性
    • 操作系统的环境变量
  • POM文件中自定义的Properties属性

1. 内置属性(Maven预定义,用户可以直接使用)

内置属性值属性描述
basedir表示项目根目录,即包含pom.xml文件的目录
version表示项目版本
project.basedir同basedir
project.baseUri表示项目文件地址
maven.build.timestamp表示项目构件开始时间
maven.build.timestamp.format表示属性${maven.build.timestamp}的展示格式,默认值为yyyyMMdd-HHmm,可自定义其格式,其类型可参考Java.text.SimpleDateFormat。

使用方式如下:

<properties>
    <maven.build.timestamp.format>
    yyyy-MM-dd HH:mm:ss
    </maven.build.timestamp.format>
</properties> 

2. xml标签属性

xml标签属于层叠式标签,也就是一层套一层的形式,maven支持以 . 链接标签层级来访问 pom.xml 和 settings.xml 中所有的标签值。
pom.xml 根标签为project,因而可以使用 project.xxx 来访问pom.xml中所有属性,比如 ${project.build.finalName} 即表示如下代码中finalName标签中的值

<project>
  <build>
    <finalName>my-web</finalName>
  </build>
</project>

settingx.xml 根标签为settings, 因而可以使用 settings.xxx 来访问settings.xml中所有属性,比如
${settings.localRepository} 即可以获得本地仓库的配置地址

<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 http://maven.apache.org/xsd/settings-1.2.0.xsd">
  <!-- localRepository
   | The path to the local repository maven will use to store artifacts.
   |
   | Default: ${user.home}/.m2/repository -->
  <localRepository>/usr/local/maven/repo</localRepository>
</settings>

注:xml标签支持可重复标签,例如 ${project.dependecies.dependency}
可以表示多个值,因而在取值时maven无法识别你匹配的哪一个值,所以要注意你引用的属性是否是唯一的。

3. 环境变量属性

3.1 Java环境变量属性

例如常用的 ${java.version} 表示jdk的版本,可以在pom.xml中使用的java环境变量可以通过 System.getProperties()方法查看。

package cn.kerninventor.demo.multithread.classloader;

import java.util.Properties;

/**
 * @author kern
 */
public class JavaPropertiesPrinter {

    public static void println() {
        Properties properties = System.getProperties();
        properties.forEach((k, v) -> {
            System.out.println("${" + k + "}=" + v);
        });
    }

    public static void main(String[] args) {
        JavaPropertiesPrinter.println();
    }
}
/** 输出如下
        ${sun.cpu.isalist}=
        ${ftp.nonProxyHosts}=local|*.local|169.254/16|*.169.254/16
        ${socksNonProxyHosts}=local|*.local|169.254/16|*.169.254/16
        ${sun.io.unicode.encoding}=UnicodeBig
        ${sun.cpu.endian}=little
        ${java.vendor.url.bug}=http://www.azulsystems.com/support/
        ${file.separator}=/
        ${java.vendor}=Azul Systems, Inc.
        ${sun.boot.class.path}=/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/sunrsasign.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/classes
        ${java.ext.dirs}=/Users/kern/Library/Java/Extensions:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java
        ${java.version}=1.8.0_292
        ${java.vm.info}=mixed mode
        ${awt.toolkit}=sun.lwawt.macosx.LWCToolkit
        ${user.language}=zh
        ${java.specification.vendor}=Oracle Corporation
        ${sun.java.command}=cn.kerninventor.demo.multithread.classloader.JavaPropertiesPrinter
        ${java.home}=/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre
        ${sun.arch.data.model}=64
        ${java.vm.specification.version}=1.8
        ${java.class.path}=/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/crs-agent.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/cldrdata.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/dnsns.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/jaccess.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/legacy8ujsse.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/localedata.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/nashorn.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/openjsse.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/sunec.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/ext/zipfs.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/management-agent.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/lib/dt.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/lib/jconsole.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/lib/tools.jar:/Users/kern/IdeaRepo/gitee/multithread-demo/classloader/target/classes:/Users/kern/.m2/repository/org/projectlombok/lombok/1.18.20/lombok-1.18.20.jar:/Users/kern/.m2/repository/org/apache/commons/commons-lang3/3.10/commons-lang3-3.10.jar:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar
        ${user.name}=kern
        ${file.encoding}=UTF-8
        ${java.specification.version}=1.8
        ${java.awt.printerjob}=sun.lwawt.macosx.CPrinterJob
        ${user.timezone}=
        ${user.home}=/Users/kern
        ${http.nonProxyHosts}=local|*.local|169.254/16|*.169.254/16
        ${os.version}=11.4
        ${sun.management.compiler}=HotSpot 64-Bit Tiered Compilers
        ${java.specification.name}=Java Platform API Specification
        ${java.class.version}=52.0
        ${java.library.path}=/Users/kern/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.
        ${sun.jnu.encoding}=UTF-8
        ${os.name}=Mac OS X
        ${java.vm.specification.vendor}=Oracle Corporation
        ${java.io.tmpdir}=/var/folders/_q/njsjbxp51sg80_3dzqhgzdf40000gn/T/
        ${line.separator}=

        ${java.endorsed.dirs}=/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/endorsed
        ${os.arch}=aarch64
        ${java.awt.graphicsenv}=sun.awt.CGraphicsEnvironment
        ${java.runtime.version}=1.8.0_292-b10
        ${java.vm.specification.name}=Java Virtual Machine Specification
        ${user.dir}=/Users/kern/IdeaRepo/gitee/multithread-demo
        ${user.country}=CN
        ${sun.java.launcher}=SUN_STANDARD
        ${sun.os.patch.level}=unknown
        ${java.vm.name}=OpenJDK 64-Bit Server VM
        ${file.encoding.pkg}=sun.io
        ${path.separator}=:
        ${java.vm.vendor}=Azul Systems, Inc.
        ${java.vendor.url}=http://www.azulsystems.com/
        ${jdk.vendor.version}=Zulu 8.54.0.21-CA-macos-aarch64
        ${gopherProxySet}=false
        ${sun.boot.library.path}=/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib
        ${java.vm.version}=25.292-b10
        ${java.runtime.name}=OpenJDK Runtime Environment

**/

3.2 操作系统的环境变量

即各个操作系统中的环境变量,maven支持以 ${env.xxx} env前缀来访问操作系统的环境变量,例如 ${env.PATH} 即表示了当前操作系统的PATH变量。可以使用的系统环境变量不同的操作系统查看方式不同。
windows下通过右键我的电脑-》属性-》高级系统设置-》高级-》环境变量查看,或者win+R呼出任务行键入sysdm.cpl进行查看。
在这里插入图片描述

类Unix操作系统,则可以在shell命令行界面键入 env 命令查看。
在这里插入图片描述

4. 自定义属性(在pom.xml文件的标签下定义的Maven属性)

用户可以在maven的pom.xml文件中使用properties标签定义自己的属性。例如下例中自定义的jdk-version属性在compiler插件中被使用。

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>cn.kerninventor</groupId>
    <artifactId>spring-cloud-demo</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <properties>
        <jdk-version>1.8</jdk-version>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <target>${jdk-version}</target>
                    <source>${jdk-version}</source>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

在什么场景下使用自定义属性呢? 这里大概整理了几种情况

  • 对依赖版本的统一控制,可以声明 xxx.version 作版本的统一控制
  • 需要暴露给构件使用者,以支持其自定义。例如spring-boot-starter-parent 暴露的project.build.sourceEncoding属性以支持依赖使用者自定义其资源的编码格式。这种自定义是利用的pom的继承性来进行属性的重写
  • 多处配置的统一管理,如果你的某些配置可能在多处声明,你可以使用自定义属性来统一,以避免每次去多处修改。

现在有些开发中使用到的类似内置属性的配置其实是重写了引入依赖中定义的属性,例如 <project.build.sourceEncoding> UTF-8</project.build.sourceEncoding> 其实是spring-boot-starter-parent 构件中定义的属性, 因此,如果你不清楚一个属性的出处(可以查阅官方文档),且该属性并非来自官方的内置属性,那么建议谨慎使用。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.5.2</version>
  </parent>
  <artifactId>spring-boot-starter-parent</artifactId>
  <packaging>pom</packaging>
  <name>spring-boot-starter-parent</name>
  <description>Parent pom providing dependency and plugin management for applications built with Maven</description>
  <properties>
    <!--这里自定义的属性是为了构件时使用的resources插件的编码定义一个格式,
之所以不直接在相关引用出书写编码格式,是为了方便引用依赖的用户自定义他的编码格式 -->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  
  <build>
  	    <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-resources-plugin</artifactId>
          <configuration>
            <propertiesEncoding>${project.build.sourceEncoding}</propertiesEncoding>
            <delimiters>
              <delimiter>${resource.delimiter}</delimiter>
            </delimiters>
            <useDefaultDelimiters>false</useDefaultDelimiters>
          </configuration>
        </plugin>
  </build>
</project>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值