maven内置变量

20 篇文章 0 订阅
4 篇文章 0 订阅

一个优秀的构建系统必须足够灵活,应该能够让项目在不同的环境下都能成功构建。

maven为了支持构建的灵活性,内置了三大特性,即:属性、profile和资源过滤。

maven属性分6类

1. 内置属性

内置属性:如${basedir}表示项目根目录,${version}表示项目版本。

2. POM属性

<project>
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.sonatype.mavenbook</groupId>
   <artifactId>project-a</artifactId>
   <version>1.0-SNAPSHOT</version>
   <packaging>jar</packaging>
   <build>
      <finalName>${project.groupId}-${project.artifactId}</finalName>
   </build>
</project>

可以使用点标记(.)的路径来引用POM元素的值。

${basedir} 项目根目录
${project.build.directory} 构建目录,缺省为target
${project.build.outputDirectory} 构建过程输出目录,缺省为target/classes
${project.build.finalName} 产出物名称,缺省为${project.artifactId}-${project.version}
${project.packaging} 打包类型,缺省为jar
${project.xxx} 当前pom文件的任意节点的内容

3. 自定义属性

用户可以在pom的<properties>元素下自定义maven属性。

 <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <skipTests>true</skipTests>
</properties>

4. setting属性

用户可以使用以settings开头的属性引用settings.xml中xml元素的值,如

${settings.localRepository}指向用户本地仓库的地址。

5. java系统属性

maven可以使用当前java系统的属性,如${user.home}指向了用户目录。

6. 环境变量属性

env变量,暴露了你操作系统或者shell的环境变量。便 如在Maven POM中一个对${env.PATH}的引用将会被${PATH}环境变量替换,在Windows中为%PATH%。所有环境变量都可以使用以env.开头的属性。如:${env.JAVA_HOE}

maven profile

profile其实就相当于定义了一系列的profile变量,在具体构建时可用使用其中的某个profile去变量替换资源文件。

jdbc.driverClassName=${db.driver}  
jdbc.url=${db.url}  
jdbc.username=${db.user}  
jdbc.password=${db.pwd} 

<profiles>  
 <profile>  
  <id>dev</id>  
  <properties>  
   <db.driver>oracle.jdbc.driver.OracleDriver</db.driver>  
   <db.url>jdbc:oracle:thin:@10.252.48.3:1521:dbname</db.url>  
   <db.user>username</db.user>  
   <db.pwd>userpwd</db.pwd>  
  </properties>  
 </profile>  
 <profile>  
  <id>test</id>  
  <properties>  
   <db.driver>oracle.jdbc.driver.OracleDriver</db.driver>  
   <db.url>jdbc:oracle:thin:@10.252.48.3:1521:testdbname</db.url>  
   <db.user>testusername</db.user>  
   <db.pwd>testuserpwd</db.pwd>  
  </properties>  
 </profile>  
</profiles>  
 

根据需要,可以在以下文件声明profile:

  • pom.xml 针对当前项目
  • 用户 settings.xml 用户目录下的.m2/settings.xml, 对当前用户的所有项目有效。
  • 全局 settings.xml 即maven安装目录下的conf/settings.xml。对本机上的所有项目有效。

一般的项目都会运行在不同的环境上,比如我们有本地环境、开发环境、测试环境、生产环境等等。

这些不同的环境,必然有不同的配置。比如日志级别,开发环境我们一般设置成debug,而生产环境一般设置成warn。我们肯定不希望:手动修改项目配置文件,然后才打包发布到不同的环境。

这个时候我们可以使用maven的profile,在pom.xml中为不同的环境配置不同的profile。

<project>
    <profiles>
        <profile>
            <id>local</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <zoo.url>172.17.103.107:2181</zoo.url>                
                <log.level>DEBUG</log.level>
            </properties>
        </profile>
        <profile>
            <id>dev</id>
            <activation>
                <activeByDefault>false</activeByDefault>
            </activation>
            <properties>
                <zoo.url>172.17.103.108:2181</zoo.url>                
                <log.level>INFO</log.level>
            </properties>
        </profile>
    </profiles>
</project>

如果我们需要打本地环境的包,可以激活本地环境的profile:

如果我们需要打开发环境的包,可以激活开发环境的profile

资源过滤

所谓的资源:也就就是指src/main/resources和src/test/resources文件下的所有文件,默认情况下,这些文件会被复制到classpath下面,即target/classes下面。

所谓资源过滤,就是过滤这些文件夹下面的文件里面的内容。上面我们为本地环境和开发环境配置了不同的profile,我们代码怎么去读取这些配置的值呢?我们可以定义一个config.properties,放在src/main/resources/下面:

zoo.url=${zoo.url}
log.level=${log.level}

接下来我们需要在pom.xml中开启资源过滤:目的是为了让maven将文件中的占位符替换成实际值。

<build>
    <!-- 替换配置文件中的数据项 start -->
    <resources>
        <resource>           
           <directory>src/main/resources</directory>
           <filtering>true</filtering>
        </resource>
    </resources>
    <testResources>
        <testResource>
            <directory>src/test/resources</directory>
            <filtering>true</filtering>
        </testResource>
    </testResources>
    <!-- 替换配置文件中的数据项 end -->        
</build>

如果我们激活本地环境的profile,可以看到最终构建出的config.properties内容如下:

如果我们激活开发环境的profile,可以看到最终构建出的config.properties内容如下:

通过maven的profile和资源过滤,我们只需要在不同的环境激活对应的profile,配置信息就会自动改变,不需要我们取修改项目中的代码或者配置文件,所有变量都是定义在pom.xml中的。

下面具体介绍一下资源过滤的属性:

<build>    
            
        <!-- 主资源目录 -->    
        <resources>    
            <resource>    
                <!-- 设定主资源目录  -->    
                <directory>src/main/resources</directory>    
                    
                <!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,只处理如下配置中包含的资源类型     
                <includes>    
                    <include>*.xml</include>    
                </includes>    
                 -->    
                     
                <!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,不处理如下配置中包含的资源类型(剔除下如下配置中包含的资源类型)     
                <excludes>    
                    <exclude>*.xml</exclude>    
                </excludes>    
                -->    
                    
                <!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,指定处理后的资源文件输出目录,默认是${build.outputDirectory}指定的目录    
                <targetPath>d:/</targetPath>    
                   -->    
                      
                <!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,是否对主资源目录开启资源过滤 -->    
                <filtering>true</filtering>    
                    
            </resource>    
        </resources>    
    </build>  

package com.ksyun.train.plugins; import com.sun.tools.javac.util.List; import org.apache.maven.artifact.Artifact; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugins.annotations.Component; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.project.MavenProject; import org.codehaus.plexus.util.FileUtils; import java.io.File; import java.io.IOException; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; // ⽬标名统⼀为bootJar @Mojo(name="bootJar") public class BootJarMojo extends AbstractMojo { // 可⾃由获取maven内置变量 @Parameter(defaultValue = "${settings.localRepository}", required = true) private String localRepository; // 接收通过命令mvn -Dmain.class=com.ksyun.train.App传递的参数, 请勿修改参数名 @Parameter(property = "main.class", required = true) private String mainClass; // maven项⽬信息,需要的数据基本都可以从此对象中获取, // 请⾃⾏调试打印观察project信息,开发过程中可利⽤json⼯具打印该对象信息 @Component protected MavenProject project; // 请实现插件的核⼼逻辑⽅法execute public void execute() throws MojoFailureException { getLog().info("project localRepository is " + localRepository); File baseDir = project.getBasedir(); getLog().info("project base dir is " + baseDir); String artifactId = project.getArtifactId(); String version = project.getVersion(); File targetDirectory = new File(baseDir, "target"); File classesDirectory = new File(targetDirectory, "classes"); getLog().info("project classes dir is " + classesDirectory.getAbsolutePath()); // get project dependency jars, ignore dependency transfer, only one demo // 获取项目依赖的jar包文件 List<File> dependencyFiles = (List<File>) project.getDependencyArtifacts() .stream() .map(Artifact::getFile) .filter(Objects::nonNull) .collect(Collectors.toList()); } }
07-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值