侧边栏壁纸
博主头像
孔子说JAVA博主等级

成功只是一只沦落在鸡窝里的鹰,成功永远属于自信且有毅力的人!

  • 累计撰写 297 篇文章
  • 累计创建 134 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

maven6大类属性使用方式与filtering资源过滤详解

孔子说JAVA
2022-05-18 / 0 评论 / 0 点赞 / 94 阅读 / 6,077 字 / 正在检测是否收录...

你可以在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文件。

image-1652320234471

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>

image-1652323034638

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}表示本地仓库的地址

image-1652323072378

2.5 java系统属性

java中的系统属性也可以作为maven属性去使用,被称为java系统属性,所有的Java属性都可以使用Maven属性引用

  • 使用方式 ${java_property_name},例如 ${java.version}
  • mvn help:system 可以查看所有的Java属性
  • System.getProperties() 可以得到所有的Java属性
  • ${user.home} 表示用户目录

image-1652323093161

查看java系统属性命令 mvn help:system

image-1652323164977

2.6 环境变量属性

一般安装软件时,都会配置系统环境变量,例如JAVA_HOME,这些环境变量也可以作为maven属性,被称为环境变量属性。所有的环境变量都可以用 env. 开头的Maven属性引用。

  • 使用方式 ${env.variable_name,例如 ${env.PATH}
  • mvn help:system 可查看所有的环境变量
  • ${env.JAVA_HOME} 表示JAVA_HOME环境变量的值

image-1652323190232

查看环境变量属性命令 mvn help:system

image-1652323233782

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指令了。

0

评论区