你可以在maven的pom.xml文件或者资源文件中使用属性,从而帮助您简化pom.xml文件的读取和维护。maven属性包括六种类型:内置属性、pom属性、自定义属性、settings属性、Java系统属性、环境变量属性。资源文件会被Maven Resource 插件的过滤特性处理。一个属性永远包含在 ${}
中。例如,要引用 project.version
属性,就需要这样写 ${project.version}
。
1、maven属性概述
maven的属性可以理解为我们定义了一个变量,然后使用这个变量。我们经常在maven项目的pom文件中,可以看到这样的代码:
<properties>
<spring.framework>4.0.4.RELEASE</spring.framework>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.framework}</version>
</dependency>
</dependencies>
在这段xml代码中,先是定义了一个 maven 属性 spring.framework
,然后用 ${spring.framework}
的方式引用该maven属性的值。maven完成依赖解析后,spring-core依赖的版本为maven属性 spring.framework
定义的值 4.0.4.RELEASE
。
其实,这只是maven属性使用方式中的一种:先自定义maven属性,然后在其他地方以特定语法格式引用该属性的值,具体语法格式如下:
<!-- 自定义属性 -->
<property_name>property_value</property_name>
<!-- 引用方式 -->
${property_name}
2、maven属性的分类
2.1 内置属性
在maven中,系统内置了一些公共属性,如 ${project.basedir}
表示当前项目的路径,如我们新建了一个maven项目,pom文件所在的路径即是项目路径,这里是:E:\ideagit\demo\test
,可以看到在此目录下有个pom.xml文件。
maven的内置属性如下:
${basedir}
是maven项目的根目录,也就是pom.xml文件的父目录,与${project.basedir}
等价${version}
是maven项目的版本号,与${project.version}
等价${project.baseUri}
是maven项目的文件地址${maven.build.timestamp}
表示项目构建开始时间${maven.build.timestamp.format}
表示${maven.build.timestamp}
的展示格式,默认值为yyyyMMdd-HHmm
<properties>
<maven.build.timestamp.format>yyyy-MM-dd HH:mm:ss</maven.build.timestamp.format>
</properties>
2.2 项目属性(pom属性)
在pom文件中有很多标签,大部分的标签都可以作为maven属性,被称作项目属性或pom属性。例如,<artifactId>
标签,将其作为maven属性时,引用方式为 ${project.artifactId}
,使用pom属性可以引用到pom.xml文件中对应元素的值。
- 项目/pom属性的引用方式:
${project.label_name}
maven的项目属性如下:
${project.build.sourceDirectory}
是maven项目的源代码所在目录,默认为 src\main\java${project.build.testSourceDirectory}
是maven项目的测试源码目录,默认为 src\test\java${project.build.directory}
是maven项目的构建工作路径,默认为target/,如例子中的E:\ideagit\demo\test\target
${project.build.outputDirectory}
是maven项目的构建(代码编译)输出目录,默认为 target\classes${project.testOutputDirectory}
是maven项目的测试代码编译输出目录,默认为 target\test-classes${project.baseUri}
是maven项目的文件地址${project.groupId}
是maven项目的 groupId${project.artifactId}
是maven项目的 artifactId${project.version}
是maven项目的version,同${version}
${project.packaging}
是maven项目的${project.parent.groupId}
是引用maven项目父模块的项目属性groupId${project.build.fianlName}
是maven项目打包输出文件的名称。默认为${project.artifactId}-${project.version}
在依赖中使用pom属性
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>part-a</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>part-b</artifactId>
<version>${project-version}</version>
</dependency>
</dependencies>
在插件中使用pom变量
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.5</version>
<configuration>
<repositoryDirectory>${project.build.directory}/test-reports</repositoryDirectory>
</configuration>
</plugin>
2.3 自定义属性
自定义属性,就是在pom文件中通过<properties>
标签自定义maven属性,然后以 ${property_name}
的形式引用,具体语法格式如下:
- 自定义属性:
<property_name>property_value</property_name>
- 引用方式:
${property_name}
在依赖中使用自定义属性
<project>
<!-- 自定义属性 -->
<properties>
<mysql.version>5.6.32</mysql.version>
</properties>
<!-- 使用属性 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
</project>
2.4 settings属性
settings.xml文件中有很多标签,这些标签也可以作为maven属性去使用,被称为settings属性。与pom属性同理,用户可以用 settings.
开头的属性引用 setting.xml 文件的xml元素值。
- 使用方式
${settings.label_name}
,例如${settings.localRepository}
表示本地仓库的地址
2.5 java系统属性
java中的系统属性也可以作为maven属性去使用,被称为java系统属性,所有的Java属性都可以使用Maven属性引用
- 使用方式
${java_property_name}
,例如${java.version}
mvn help:system
可以查看所有的Java属性System.getProperties()
可以得到所有的Java属性${user.home}
表示用户目录
查看java系统属性命令 mvn help:system
2.6 环境变量属性
一般安装软件时,都会配置系统环境变量,例如JAVA_HOME,这些环境变量也可以作为maven属性,被称为环境变量属性。所有的环境变量都可以用 env.
开头的Maven属性引用。
- 使用方式
${env.variable_name
,例如${env.PATH}
mvn help:system
可查看所有的环境变量${env.JAVA_HOME}
表示JAVA_HOME环境变量的值
查看环境变量属性命令 mvn help:system
3、filtering资源过滤
默认情况下,Maven属性只有在POM中才会被解析。资源过滤就是指让Maven属性在资源文件(src/main/resources、src/test/resources)中也能被解析。
-
Maven用maven-resources-plugin处理资源文件。它默认的行为只是将项目主资源文件复制到主代码编译输出目录中,将测试资源文件复制到测试代码编译输出目录中。
-
Maven默认的主资源目录和测试资源目录的定义是在超级POM中,要为资源目录开启过滤,只要在此基础上添加一行filtering配置即可。
-
Filtering是maven resource插件的功能,作用是用环境变量,pom文件里定义的属性和指定文件里的属性替换属性文件的占位符。
-
超级pom地址: apache-maven-3.3.9\lib\maven-model-builder-3.3.9.jar\org\apache\maven\model\pom-4.0.0.xml
在POM中添加下面的配置便可以开启资源过滤
<build>
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<testResources>
<testResource>
<directory>${project.basedir}/src/test/resources</directory>
<filtering>true</filtering>
</testResource>
</testResources>
</build>
从上面的配置中可以看出,我们其实可以配置多个主资源目录和多个测试资源目录。
Maven除了可以对主资源目录、测试资源目录过滤外,还能对Web项目的资源目录(如css、js目录)进行过滤。这时需要对maven-war-plugin插件进行配置。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1-beta-1</version>
<configuration>
<webResources>
<resource>
<filtering>true</filtering>
<directory>src/main/webapp</directory>
<includes>
<include>**/*.css</include>
<include>**/*.js</include>
</includes>
</resource>
</webResources>
</configuration>
</plugin>
资源过滤更详细的教程请参考:maven中profiles使用详解,与Filtering结合使用实战
4、其他
maven jetty 插件的一些命令:
启动:mvn jetty:run
默认的端口号是8080。
启动时,设置端口号: mvn -Djetty.port=9999 jetty:run
debug的方式启动:mvnDebug jetty:run
启动之后,会显示具体的debug端口
某些工程有pom.xml文件, 但是工程显示不是maven工程。此时需要执行pom命令,首先在工程上右键→「maven」→「Enable Dependency Management」,将工程变为maven工程。然后就可以执行POM指令了。
评论区