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还有其他激活方法,如:
- DispatcherServlet的初始化参数传入
- web app上下文参数传入
- JNDI入口
- 环境变量
- JVM系统属性
- @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在哪里定义
和怎样激活。
- maven profile可以在pom.xml中定义,可以定制的元素比较多,比如构建名称,依赖等,打包后pom.xml中包含完整的profile
- 也可以在settings.xml中定义,分为用户级别(对本机用户所有maven项目使用)和全局级别(对本机所有maven项目使用)。
- 使用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的激活:
- 命令行激活,使用-P参数,如果有多个profile则使用逗号隔开
- 使用settings.xml文件激活
- 系统属性激活,如果某个系统属性存在就能激活,甚至某个系统属性等于某个值才能激活
- 操作系统环境激活,系统是windows ?,linux?
- 文件存在与否激活
- 默认激活
来源:oschina
链接:https://my.oschina.net/u/2753181/blog/1824218