spring profile 与maven profile

匆匆过客 提交于 2021-02-18 08:26:35

profile:

n.  侧面,半面; 外形,轮廓; [航]翼型; 人物简介;
vt.  描…的轮廓; 给…画侧面图; 为(某人)写传略; [机]铣出…的轮廓;

这个词具体是什么意思,参考:https://www.zhihu.com/question/28464897

我的理解,就是一个配置。

一、spring中的profile

 profile 说白了就是利用一个变量来控制加载哪些bean。主要用在实现在不同的环境下加载不同的bean。

比如在测试环境下,加载根据这个数据库的配信息生成的bean,在生产环境下使用另一个bean。

简单用法:

将spring-profile-test.xml和spring-profile-dev.xml都import入主配置文件中,但是由于spring.profile.active的值不同,真正加载的bean也不同(不满足profile值的bean不会被加载,此时相当于import了一个空文件)

在运行的使用配置下面参数来激活test环境需要加载的bean,profile的值可以有多个,测试需要用“,”隔开。

-Dspring.profiles.active=test

当然profile还有其他激活方法,如:

  1. DispatcherServlet的初始化参数传入
  2. web app上下文参数传入
  3. JNDI入口
  4. 环境变量
  5. JVM系统属性
  6. @ActiveProfiles

二、maven中的profile

spring的核心是依赖反转(创建bean,注入bean),是所以spring的profile是影响bean的创建和注入,maven是用来构建java项目的工具,所以maven的profile影响maven的构建。

还拿上面的场景来说明问题,我们开发的时候连接开发库,测试的时候希望连接测试库,生产环境连接生产库。我们也可以使用maven的profile在打包的环节实现(spring的profile是在运行环节的启动阶段实现的)。

我们的db.properties可以按照下面这种写法

db.driver=${db.driver}
db.url=${db.url}
db.user=${db.user}
db.password=${db.password}

在项目的pom.xml中定义这些属性

<profiles>
    <profile>
        <id>dev</id>
        <properties>
            <finalName>dev</finalName>
            <db.driver>com.mysql.jdbc.Driver</db.driver>
            <db.url>jdbc:mysql://localhost:3306/dev</db.url>
            <db.user>root</db.user>
            <db.password>123456</db.password>
        </properties>

        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <build>
            <finalName>${finalName}</finalName><!--影响最终构建名称-->
            <resources>
                <resource>
                    <filtering>true</filtering><!--启用资源过滤,影响资源文件-->
                    <directory>${project.basedir}/src/main/resources</directory>
                    <excludes>
                        <exclude>spring-profile-test.xml</exclude>
                    </excludes>
                </resource>
            </resources>
        </build>
    </profile>
</profiles>

注意:仅仅在profile中添加相应的property并不能会让maven在打包的时候替换这些属性,maven默认只会解析pom.xml中的属性引用。maven处理资源的插件是maven-resources-plugin,它默认会将资源文件复制到输出目录,如果需要它处理资源文件,就需要开启资源过滤,在resource中添加<filtering>true</filtering>即可。此时执行命令:mvn clean package -Pdev,命令执行完成后,就可以在打的包中看到如下处理过后的db.properties,如下所示

maven的profile使用的简单例子已经讲完了,下面讲,粗略地讲一下maven profile在哪里定义

和怎样激活。

  1. maven profile可以在pom.xml中定义,可以定制的元素比较多,比如构建名称,依赖等,打包后pom.xml中包含完整的profile
  2. 也可以在settings.xml中定义,分为用户级别(对本机用户所有maven项目使用)和全局级别(对本机所有maven项目使用)。
  3. 使用maven2时还可以在项目的pom.xml所在的目录中使用profiles.xml定义,maven3中已移除,不推荐使用。

不同地方定义的profile可以使用的pom元素不同。pom.xml中的profile可以随着pom.xml一起提交到代码仓库中,还能被安装到本地仓库和远程仓库中,所以可以修改和增加很多pom元素。pom.xml文件之外的三种profile称为外部profile,由于无法保证它们会随着pom.xml一起被分发(profiles.xml默认不会被安装到本地仓库或者远程仓库) ,所以maven不允许它们添加或者修改绝大多数的pom元素。举个例子:用户A添加了外部profile让项目构建成功,用户B没有添加而导致项目构建失败,这就导致了构建项目的移植性问题。

下面列maven profile的激活:

  1. 命令行激活,使用-P参数,如果有多个profile则使用逗号隔开
  2. 使用settings.xml文件激活
  3. 系统属性激活,如果某个系统属性存在就能激活,甚至某个系统属性等于某个值才能激活
  4. 操作系统环境激活,系统是windows ?,linux?
  5. 文件存在与否激活
  6. 默认激活

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!