通过${}访问属性
。Maven提供了隐式的变量,可以用来访问环境变
量,POM信息,和Maven Settings:
env
env变量暴露了你操作系统或者shell的环境变量。
project
project变量暴露了POM。你可以使用点标记(.)的路径来引用POM元素
的值。例如,${project.artifactId}。
settings
settings变量暴露了Maven settings信息。可以使用点标记(.)的路径来引
用settings.xml文件中元素的值。例如,${settings.offline}会引用~/.m2/
settings.xml文件中offline元素的值。
系统属性,只要是能通过System.getProperty()方法获取的属性都可以作为Maven属性被引 用
除了隐式变量,还提供一些非隐式功能
Java系统属性
所有可以通过java.lang.System中getProperties()方法访问的属性都被暴露
成POM属性。具体能访问到什么属性,可以查看java.lang.System类的Javadoc中找到。
项目的属性
[url]http://maven.apache.org/ ref/2.0.9/maven-model/maven.html[/url]
常用的“
project.groupId 和 project.version
project.name
project.description
• project.build.sourceDirectory
• project.build.scriptSourceDirectory
• project.build.testSourceDirectory
• project.build.outputDirectory
• project.build.testOutputDirectory
• project.build.directory
sourceDirectory,scriptSourceDirectory,和testSourceDirectory提供了项 目源码目录的访问方式。outputDirectory和testOutputDirectory则能让你访问 Maven放置字节码和其它构建输出的目录。directory引用的目录就是包含上述两 个输出目录的父目录。
Maven的Settings属性
你也可以引用任何Maven本地Settings文件的属性,该文件通常位于~/.m2/ settings.xml。
环境变量属性
环境变量可以通过env.*前缀引用。以下列表是一些有趣的环境变量:
env.PATH 包含了Maven运行的当前PATH。该PATH包含了一个用来查找可运行脚本和程序的 目录列表,
env.HOME (在*nix系统中)这个变量指向了用户的home目录。但你更应该使用/home/ hudson,而非这个变量。
env.JAVA_HOME 指向了Java安装目录。它要么指向JDK安装目录,要么或者JRE目录。但你更应该 考虑使用/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0/jre而非这个属性。
env.M2_HOME 指向了Maven2安装目录
自定义属性
我们还可以通过pom.xml或者settings.xml中的properties元素设置自己的属
性,或者还可以使用外部载入的文件中属性。
如
<project> ... <properties> <arbitrary.property.a>This is some text</arbitrary.property.a> <hibernate.version>3.3.0.ga</hibernate.version> </properties> ... <dependencies> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate</artifactId> <version>${hibernate.version}</version> </dependency> </dependencies> ... </project>
资源过滤
你可以使用Maven来对项目资源进行变量替换。在资源过滤被激活的时候,Maven会扫描 资源,寻找由${ 和}包围的Maven属性的引用。一旦它找到这些引用,它就会使用合适 的值去替换它们,就像前一节中定义的属性可以在POM中引用一样。当你需要根据目标 部署平台使用不同的配置来参数化一个构建的时候,这就非常有用。
通常一个在src/main/resources目录下的.properties文件或者XML文档会包含对外部资 源的引用,如需要根据目标部署平台进行不同配置的数据库或网络地址。例如,一个从 数据库读取数据的系统有一个XML文档,其包含了数据库的JDBC URL以及安全凭证。如 果你在开发和产品环境使用不同的数据库。你可以选择使用一种技术如JNDI将配置信息 从应用程序提取出来至应用服务器,或者你可以创建一个知道如何根据目标平台用不同 的值替换变量的构建。
假设SPRING的配置关于数据库配置部分是
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id="someDao" class="com.example.SomeDao"> <property name="dataSource" ref="dataSource"/> </bean> <bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource" <property name="driverClassName" value="${jdbc.driverClassName}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> </beans>
POM
<project> ... <properties> <jdbc.driverClassName>com.mysql.jdbc.Driver</jdbc.driverClassName> <jdbc.url>jdbc:mysql://localhost:3306/development_db</jdbc.url> <jdbc.username>dev_user</jdbc.username> <jdbc.password>s3cr3tw0rd</jdbc.password> </properties> ... <build> <resources> <resource>src/main/resources</resource> <filtering>true</filtering> </resources> </build> ... <profiles> <profile> <id>production</id> <properties> <jdbc.driverClassName>oracle.jdbc.driver.OracleDriver</jdbc.driverClassName> <jdbc.url>jdbc:oracle:thin:@proddb01:1521:PROD</jdbc.url> <jdbc.username>prod_user</jdbc.username> <jdbc.password>s00p3rs3cr3t</jdbc.password> </properties> </profile> </profiles> </project>
maven默认资源过滤是关闭的,通过 <resources>
<resource>src/main/resources</resource>
<filtering>true</filtering>
</resources>
开启资源过滤
另外如上profile功能的存在,在不同环境,数据库的连接配置也会变化。