🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] # 简介 在开发的过程中,经常需要面对不同的运行环境(开发环境、测试环境、生产环境、内网环境、外网环境等等),在不同的环境中,相关的配置一般不一样,比如数据源配置、日志文件配置、以及一些软件运行过程中的基本配置。每次在不同环境部署程序时,都需要修改相应的配置文件,使之完成环境的配置。 # 项目目录 ![](https://img.kancloud.cn/9d/20/9d2096d7f0a8aec8eb7422d20c2bfe36_323x165.png) # 代码 `jdbc.properties` ~~~ jdbc.driver=${jdbc_driver} jdbc.url=${jdbc_url} jdbc.username=${jdbc_username} jdbc.password=${jdbc_password} ~~~ `filter-dev-env.properties` ~~~ jdbc_driver=com.mysql.jdbc.Driver jdbc_url=jdbc:mysql://127.0.0.1:3306/dev jdbc_username=root jdbc_password=123456 ~~~ 其他类似,只是库不一样 `pom.xml` ~~~xml <profiles> <profile> <!-- 本地开发环境 --> <id>dev</id> <properties> <profiles.active>dev</profiles.active> </properties> <!-- 默认是本地开发环境 --> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> <profile> <!-- 测试环境 --> <id>test</id> <properties> <profiles.active>test</profiles.active> </properties> </profile> <profile> <!-- 生产环境 --> <id>pro</id> <properties> <profiles.active>pro</profiles.active> </properties> </profile> </profiles> <build> <!-- maven模块化的话最好从父类继成取,打成包的命名 --> <finalName>${artifactId}-${version}</finalName> <!-- 使用指定的filter进行过滤,在执行mvn命令的时候带上-Ppro就代表生产环境,就会加载生产环境的properties,-Pdev就代表开发环境(默认) --> <filters> <filter>src/main/resources/multiEnv/filter-${profiles.active}-env.properties</filter> </filters> <!-- 配置需要被替换的资源文件路径, jdbc.properties --> <resources> <resource> <!-- 资源文件位置src/main/resources/,这下面的资源文件的${}会全部被替换成filter中的标签内容。 directory指定的value会作为classes的资源跟目录, 比如指定:src/main/resources/,则classes下会出现jdbc等包, 若指定:src/main/resources/jdbc/,则classes下直接出现jdbc包下的文件,不会额外出现jdbc等其他包结构。因为他把jdbc作为了根目录 --> <directory>src/main/resources/</directory> <!-- 在某个resource中如果设置filtering为true,将会根据输入参数动态修改相关内容。只有我们开启资源过滤后,在 properties 文件中才能引用我们在 pom 文件中定义的属性 --> <filtering>true</filtering> <!-- 排除标签 --> <excludes> <!-- exclude可以排除指定文件,支持通配符 ,匹配项不会生成到classes目录下,路径是以directory开始的 在这里就是directory(src/main/resources/)/multiEnv/filter-*-env.properties --> <exclude>multiEnv/filter-*-env.properties</exclude> <!-- **/*.xml 代表 directory(src/main/resources/)目录以及所有子目录的xml文件--> <!-- <exclude>**/*.xml</exclude> <exclude>**/*.properties</exclude> --> </excludes> <!-- 包含标签 --> <!-- <includes> <include></include> </includes> --> </resource> </resources> </build> ~~~ # 运行 打包时,自己肯定知道是生产环境还是部署环境,所以只需要在打包的时候加上参数即可,如下: **打本地开发环境包**:`mvn clean package -Dmaven.test.skip=true -Pdev` **打部署上线环境包**:`mvn clean package -Dmaven.test.skip=true -Ppro` **打测试环境包**:`mvn clean package -Dmaven.test.skip=true -Ptest` # 另一个例子 application.properties ~~~ app=learn-maven-properties version=1.0.0 ## 下面信息有maven profile动态设置 apiUrl=${maven-apiUrl} username=${maven-username} password=${maven-password} ~~~ pom.xml ~~~ <!-- 定义maven的版本属性 --> <properties> <spring.version>4.3.12.RELEASE</spring.version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies> <build> <finalName>learn-maven-properties</finalName> <!-- 必须开启资源过滤 --> <!-- 只有我们开启资源过滤后,在 properties 文件中才能引用我们在 pom 文件中定义的属性 --> <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> <profiles> <profile> <id>default</id> <properties> <!-- 自定义属性 --> <maven-apiUrl>http://192.168.10.180:8080</maven-apiUrl> <maven-username>root</maven-username> <maven-password>aaaaaa</maven-password> </properties> <activation> <!-- 设置默认激活这个配置 --> <activeByDefault>true</activeByDefault> </activation> </profile> <profile> <id>release</id> <properties> <!-- 自定义属性 --> <maven-apiUrl>http://10.87.11.228:8080</maven-apiUrl> <maven-username>root</maven-username> <maven-password>relase_password</maven-password> </properties> </profile> </profiles> </project> ~~~ 上面的 pom.xml 文件定义了两个profile,分别为 default 和 release;每个profile中定义了三个属性,分别为“maven-apiUrl”、“maven-username”和“maven-password”属性,这些属性将在 application.properties 属性文件中通过“${}”方式使用。 `mvn -D`代表(Properties属性) \-D参数和执行 java 时指定的 -D 类似。使用命令行设置属性 -D 的正确方法是: ~~~ mvn -DpropertyName=propertyValue clean package ~~~ 其中: * 如果 propertyName 不存在 pom.xml,它将被设置。 * 如果 propertyName 已经存在 pom.xml,其值将被作为参数传递的值覆盖-D。 要发送多个变量,请使用多个空格分隔符加-D: ~~~ mvn -DpropA=valueA -DpropB=valueB -DpropC=valueC clean package ~~~ 执行 ~~~ mvn -D maven-password=123456 clean package ~~~ 使用 `-D` 修改 maven-password 的值为 123456 --- \-P代表(Profiles配置文件) 在上面的 pom.xml 文件中,指定的分别为“default”和“release”,可以通过-P进行传递“default”或“release”来激活某个 profile。运行如下命令: ~~~ mvn -Prelease clean package ~~~ --- 使用activation标签指定其他的激活条件 ~~~ <profiles> <profile> <id>default</id> <activation> <property> <name>env</name> <value>dev</value> </property> <!-- 设置默认激活这个配置 --> <activeByDefault>true</activeByDefault> </activation> <properties> <!-- 自定义属性 --> <maven-apiUrl>http://192.168.10.180:8080</maven-apiUrl> <maven-username>root</maven-username> <maven-password>aaaaaa</maven-password> </properties> </profile> <profile> <id>release</id> <activation> <property> <name>env</name> <value>release</value> </property> </activation> <properties> <!-- 自定义属性 --> <maven-apiUrl>http://10.87.11.228:8080</maven-apiUrl> <maven-username>root</maven-username> <maven-password>relase_password</maven-password> </properties> </profile> </profiles> ~~~ 上面在每个profile中定义了一个激活条件,即 env 属性;当 env=dev 时,激活 id=default 的 profile;当env=release,激活 id=release 的 profile。 ~~~ mvn -D env=release clean package ~~~ 将激活属性 env=release 的 profile 这里不要使用“`mvn -P env=release clean package`”,我们定义的 profile 触发条件为属性 env 等于 “dev”或“release”,使用 -P 将抛出提示信息: ~~~ [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 3.556 s [INFO] Finished at: 2019-08-07T08:55:30+08:00 [INFO] ------------------------------------------------------------------------ [WARNING] The requested profile "env=release" could not be activated because it does not exist. ~~~