一、pom文件中${}是干什么的
1、我们知道一般情况下在配置文件中使用${}都是在xxx.xml中 然后相应的具体属性配置在xxx.properties之中。
如在在applicationContext.xml文件中配置数据连接池:
applicationContext.xml
<!-- 配置数据链接池
-->
<xml>
<propertyname
="dataSource">
<beanclass
="com.mchange.v2.c3p0.ComboPooledDataSource">
<propertyname
="jdbcUrl"value
="${jdbcUrl}"></property
>
<propertyname
="driverClass"value
="${driverClass}"></property
>
<propertyname
="user"value
="${user}"></property
>
<propertyname
="password"value
="${password}"></property
>
<!-- 其它配置
-->
<xml
/>
这个xml中就使用了${}的功能。它相当于Java中调用了变量名一样。
在本例子中,这些变量来自另外一个properties文件。该properties为: jdbc.properties(主要用来存放JDBC连接数据库的一些配置,方便下次修改,而不需要在applicationContext.xml文件中修改。)
jdbc.properties:
jdbcUrl
=jdbc
:mysql
://localhost
:3306/oa
driverClass
=com
.mysql
.jdbc
.Driver
user
=root
password
=123456
而且还需要在xxx.xml中引入properties文件, 一般情况下,如果你只有一个applicationContext.xml配置文件而已的话,那么只需要在applicationContext.xml文件中添加一行:
<!-- 导入外部的properties文件
-->
<context
:property
-placeholder location
="classpath:jdbc.properties"/>
2、SpringEL表达式取值一般是${var}方式取值, 见于application.properties和@Value("${var}")中
3、maven的pom.xml文件中也有类似的取值表达式, 也是通过${var}的方式取值 然而: 它们并不是一个东西!
EL表达式适用于配置文件及代码中的注解maven的占位符取值表达式默认仅仅适用于pom.xml文件中我们的需求大多是想打通二者的交流,如何做?此时filtering就派上用场了
maven的占位符解析表达式的使用场合默认只在pom文件范围内活动如果想扩大它的活动范围,就必须指定需要扩大到哪些文件,在pom文件中指定filtering=true.然后maven的占位符解析表达式就可以用于它里面的表达式解析了
<build>
<resources>
<resource>
<directory>$
{project
.basedir
}/src
/main
/resources
</directory
>
<filtering>true</filtering
>
</resource
>
</resources
>
</build
>
如果你的项目继承了spring-boot-starter-parent, 如果想在application.properties中使用maven的占位符以获取maven的参数,此时就不能用${},因为可能会与EL表达式冲突,此时parent依赖将maven占位符表达式默认改为@var@的形式. 所以只能用@var@替代${var} 4、总结
Spring EL表达式和MAVEN的占位符表达式长得一样,但两者默认进水不犯河水,不能再Spring的范围内取maven的参数
filtering的作用就是打通两者的连接, 让井水犯河水, 具体来说是让Spring的范围内能取到maven的参数
filtering的使用要配合resource一起使用: 前者开启打通连接,后者指定打通的范围.
二、Maven内置三大特性中的属性
${}变量的读取这个功能是Maven提供的,属于 "maven properties 资源过滤
Maven内置了三大特性:属性、Profile和资源过滤来支持构建的灵活性。
1、先看我们关心得问题。“为什么在xxx.properties,xxx.xml 中能使用${} 来访问pom文件的属性” 这是因为Maven 提供的资源过滤的功能
默认情况下,Maven属性只有在POM中才会被解析。资源过滤就是指让Maven属性在资源文件(src/main/resources、src/test/resources)中也能被解析。
在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>***.js
</include
>
</includes
>
</resource
>
</webResources
>
</configuration
>
</plugin
>
注意这个${} 只能引用Maven中的属性
2、Maven的属性:事实上有六种类型的Maven属性
内置属性:主要有两个常用内置属性
${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
.build
.outputDirectory
}:项目主代码编译输出目录,默认为target
/classes
/.
$
{project
.build
.testOutputDirectory
}:项目测试代码编译输出目录,默认为target
/testclasses
/.
$
{project
.groupId
}:项目的groupId
.
$
{project
.artifactId
}:项目的artifactId
.
$
{project
.version
}:项目的version
,于$
{version
}等价
$
{project
.build
.finalName
}:项目打包输出文件的名称,默认为 $
{project
.artifactId
}$
{project
.version
}.
自定义属性:在pom中元素下自定义的Maven属性。例如
<project>
<properties>
<my.prop>hello
</my
.prop
>
</properties
>
</project
>
Settings属性:与POM属性同理。如${settings.localRepository}指向用户本地仓库的地址。
Java系统属性:所有Java系统属性都可以使用Maven属性引用,例如${user.home}指向了用户目录。可以通过命令行mvn help:system查看所有的Java系统属性
环境变量属性:所有环境变量都可以使用以env.开头的Maven属性引用。例如${env.JAVA_HOME}指代了JAVA_HOME环境变量的值。也可以通过命令行mvn help:system查看所有环境变量。
三、pom文件配置解释
<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.0http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<artifactId/>
<groupId/>
<version/>
<relativePath/>
</parent>
<modelVersion>4.0.0
</modelVersion>
<groupId>asia.banseon
</groupId>
<artifactId>banseon-maven2
</artifactId>
<packaging>jar
</packaging>
<version>1.0-SNAPSHOT
</version>
<name>banseon-maven
</name>
<url>http://www.baidu.com/banseon
</url>
<description>A maven project to study maven.
</description>
<prerequisites>
<maven/>
</prerequisites>
<issueManagement>
<system>jira
</system>
<url>http://jira.baidu.com/banseon
</url>
</issueManagement>
<ciManagement>
<system/>
<url/>
<notifiers>
<notifier>
<type/>
<sendOnError/>
<sendOnFailure/>
<sendOnSuccess/>
<sendOnWarning/>
<address/>
<configuration/>
</notifier>
</notifiers>
</ciManagement>
<inceptionYear/>
<mailingLists>
<mailingList>
<name>Demo
</name>
<post>banseon@126.com
</post>
<subscribe>banseon@126.com
</subscribe>
<unsubscribe>banseon@126.com
</unsubscribe>
<archive>http:/hi.baidu.com/banseon/demo/dev/
</archive>
</mailingList>
</mailingLists>
<developers>
<developer>
<id>HELLO WORLD
</id>
<name>banseon
</name>
<email>banseon@126.com
</email>
<url/>
<roles>
<role>Project Manager
</role>
<role>Architect
</role>
</roles>
<organization>demo
</organization>
<organizationUrl>http://hi.baidu.com/banseon
</organizationUrl>
<properties>
<dept>No
</dept>
</properties>
<timezone>-5
</timezone>
</developer>
</developers>
<contributors>
<contributor>
<name/><email/><url/><organization/><organizationUrl/><roles/><timezone/><properties/>
</contributor>
</contributors>
<licenses>
<license>
<name>Apache 2
</name>
<url>http://www.baidu.com/banseon/LICENSE-2.0.txt
</url>
<distribution>repo
</distribution>
<comments>A business-friendly OSS license
</comments>
</license>
</licenses>
<scm>
<connection>
scm:svn:http://svn.baidu.com/banseon/maven/banseon/banseon-maven2-trunk(dao-trunk)
</connection>
<developerConnection>
scm:svn:http://svn.baidu.com/banseon/maven/banseon/dao-trunk
</developerConnection>
<tag/>
<url>http://svn.baidu.com/banseon
</url>
</scm>
<organization>
<name>demo
</name>
<url>http://www.baidu.com/banseon
</url>
</organization>
<build>
<sourceDirectory/>
<scriptSourceDirectory/>
<testSourceDirectory/>
<outputDirectory/>
<testOutputDirectory/>
<extensions>
<extension>
<groupId/>
<artifactId/>
<version/>
</extension>
</extensions>
<defaultGoal/>
<resources>
<resource>
<targetPath/>
<filtering/>
<directory/>
<includes/>
<excludes/>
</resource>
</resources>
<testResources>
<testResource>
<targetPath/><filtering/><directory/><includes/><excludes/>
</testResource>
</testResources>
<directory/>
<finalName/>
<filters/>
<pluginManagement>
<plugins>
<plugin>
<groupId/>
<artifactId/>
<version/>
<extensions/>
<executions>
<execution>
<id/>
<phase/>
<goals/>
<inherited/>
<configuration/>
</execution>
</executions>
<dependencies>
<dependency>
......
</dependency>
</dependencies>
<inherited/>
<configuration/>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId/><artifactId/><version/><extensions/>
<executions>
<execution>
<id/><phase/><goals/><inherited/><configuration/>
</execution>
</executions>
<dependencies>
<dependency>
......
</dependency>
</dependencies>
<goals/><inherited/><configuration/>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id/>
<activation>
<activeByDefault/>
<jdk/>
<os>
<name>Windows XP
</name>
<family>Windows
</family>
<arch>x86
</arch>
<version>5.1.2600
</version>
</os>
<property>
<name>mavenVersion
</name>
<value>2.0.3
</value>
</property>
<file>
<exists>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/
</exists>
<missing>/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/
</missing>
</file>
</activation>
<build>
<defaultGoal/>
<resources>
<resource>
<targetPath/><filtering/><directory/><includes/><excludes/>
</resource>
</resources>
<testResources>
<testResource>
<targetPath/><filtering/><directory/><includes/><excludes/>
</testResource>
</testResources>
<directory/><finalName/><filters/>
<pluginManagement>
<plugins>
<plugin>
<groupId/><artifactId/><version/><extensions/>
<executions>
<execution>
<id/><phase/><goals/><inherited/><configuration/>
</execution>
</executions>
<dependencies>
<dependency>
......
</dependency>
</dependencies>
<goals/><inherited/><configuration/>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId/><artifactId/><version/><extensions/>
<executions>
<execution>
<id/><phase/><goals/><inherited/><configuration/>
</execution>
</executions>
<dependencies>
<dependency>
......
</dependency>
</dependencies>
<goals/><inherited/><configuration/>
</plugin>
</plugins>
</build>
<modules/>
<repositories>
<repository>
<releases>
<enabled/><updatePolicy/><checksumPolicy/>
</releases>
<snapshots>
<enabled/><updatePolicy/><checksumPolicy/>
</snapshots>
<id/><name/><url/><layout/>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<releases>
<enabled/><updatePolicy/><checksumPolicy/>
</releases>
<snapshots>
<enabled/><updatePolicy/><checksumPolicy/>
</snapshots>
<id/><name/><url/><layout/>
</pluginRepository>
</pluginRepositories>
<dependencies>
<dependency>
......
</dependency>
</dependencies>
<reports/>
<reporting>
......
</reporting>
<dependencyManagement>
<dependencies>
<dependency>
......
</dependency>
</dependencies>
</dependencyManagement>
<distributionManagement>
......
</distributionManagement>
<properties/>
</profile>
</profiles>
<modules/>
<repositories>
<repository>
<releases>
<enabled/>
<updatePolicy/>
<checksumPolicy/>
</releases>
<snapshots>
<enabled/><updatePolicy/><checksumPolicy/>
</snapshots>
<id>banseon-repository-proxy
</id>
<name>banseon-repository-proxy
</name>
<url>http://192.168.1.169:9999/repository/
</url>
<layout>default
</layout>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
......
</pluginRepository>
</pluginRepositories>
<dependencies>
<dependency>
<groupId>org.apache.maven
</groupId>
<artifactId>maven-artifact
</artifactId>
<version>3.8.1
</version>
<type>jar
</type>
<classifier></classifier>
<scope>test
</scope>
<systemPath></systemPath>
<exclusions>
<exclusion>
<artifactId>spring-core
</artifactId>
<groupId>org.springframework
</groupId>
</exclusion>
</exclusions>
<optional>true
</optional>
</dependency>
</dependencies>
<reports></reports>
<reporting>
<excludeDefaults/>
<outputDirectory/>
<plugins>
<plugin>
<groupId/>
<artifactId/>
<version/>
<inherited/>
<configuration/>
<reportSets>
<reportSet>
<id/>
<configuration/>
<inherited/>
<reports/>
</reportSet>
</reportSets>
</plugin>
</plugins>
</reporting>
<dependencyManagement>
<dependencies>
<dependency>
......
</dependency>
</dependencies>
</dependencyManagement>
<distributionManagement>
<repository>
<uniqueVersion/>
<id>banseon-maven2
</id>
<name>banseon maven2
</name>
<url>file://${basedir}/target/deploy
</url>
<layout/>
</repository>
<snapshotRepository>
<uniqueVersion/>
<id>banseon-maven2
</id>
<name>Banseon-maven2 Snapshot Repository
</name>
<url>scp://svn.baidu.com/banseon:/usr/local/maven-snapshot
</url>
<layout/>
</snapshotRepository>
<site>
<id>banseon-site
</id>
<name>business api website
</name>
<url>
scp://svn.baidu.com/banseon:/var/www/localhost/banseon-web
</url>
</site>
<downloadUrl/>
<relocation>
<groupId/>
<artifactId/>
<version/>
<message/>
</relocation>
<status/>
</distributionManagement>
<properties/>
</project>
转载: 1、Maven项目为什么能使用${}来引用pom文件中的属性 2、maven中filtering的使用 3、Maven配置文件详情