spring+maven不同環境讀取配置詳解
spring+maven不同環境讀取配置詳解
轉載:https://blog.csdn.net/xiao__miao/article/details/78460725
首先這個我看了網上很多資料,但我發現,由於自己一些技術的不熟悉,對於他人的文章有些誤解,導致我打包部署失敗。
話不多說,現在我們開始一步步工程
第一步,專案讀取不通環境的配置檔案
-
<?xml version="1.0" encoding="UTF-8"?>
-
<beans xmlns="http://www.springframework.org/schema/beans"
-
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-
xmlns:context="http://www.springframework.org/schema/context"
-
xmlns:util="http://www.springframework.org/schema/util"
-
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
-
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
-
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
-
<!-- 測試環境配置檔案 -->
-
<beans profile="local">
-
<context:property-placeholder location="classpath:local/config.properties" />
-
</beans>
-
<!-- 生產環境配置檔案 -->
-
<beans profile="product">
-
<context:property-placeholder location="classpath:product/config.properties" />
-
</beans>
-
</beans>
這是我定義的一個讀配置檔案的xml——applicationContext-profile.xml
這是由web.xml裡面配置,來區分去讀哪個配置檔案
-
<!-- 配置spring的預設profile
-
可選值:product(生產環境) local(本地環境) -->
-
<context-param>
-
<param-name>spring.profiles.active</param-name>
-
<param-value>product</param-value>
-
</context-param>
-
<!-- spring hibernate -->
-
<context-param>
-
<param-name>contextConfigLocation</param-name>
-
<param-value>
-
classpath:public/spring/applicationContext-profile.xml
-
classpath:public/spring/spring-hibernate.xml
-
</param-value>
-
</context-param>
web.xml的一部分,根據配置去讀product還是local,這裡根據配置欄位能看到對於的配置檔案,這對應關係應該是能看懂的!
到這裡,你應該能根據自己的配置檔案去執行程式
第二步,根據pom檔案打包
-
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
<parent>
-
<artifactId>officialProject</artifactId>
-
<groupId>com.wm</groupId>
-
<version>1.0-SNAPSHOT</version>
-
</parent>
-
<modelVersion>4.0.0</modelVersion>
-
<artifactId>offical-web</artifactId>
-
<packaging>war</packaging>
-
<name>offical-web</name>
-
<url>http://maven.apache.org</url>
-
<properties>
-
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-
<shiro-version>1.3.2</shiro-version>
-
</properties>
-
<dependencies>
-
<dependency>
-
<groupId>junit</groupId>
-
<artifactId>junit</artifactId>
-
<version>4.11</version>
-
<scope>test</scope>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework</groupId>
-
<artifactId>spring-webmvc</artifactId>
-
<version>${spring.version}</version>
-
</dependency>
-
<dependency>
-
<groupId>com.wm</groupId>
-
<artifactId>offical-manager-service</artifactId>
-
<type>jar</type>
-
</dependency>
-
<dependency>
-
<groupId>com.wm</groupId>
-
<artifactId>official-manager-core</artifactId>
-
<type>jar</type>
-
</dependency>
-
<dependency>
-
<groupId>com.wm</groupId>
-
<artifactId>offical-common</artifactId>
-
<type>jar</type>
-
</dependency>
-
<!-- mysql資料庫驅動 -->
-
<dependency>
-
<groupId>mysql</groupId>
-
<artifactId>mysql-connector-java</artifactId>
-
<version>5.1.37</version>
-
</dependency>
-
<!--後臺許可權控制框架-->
-
<dependency>
-
<groupId>org.apache.shiro</groupId>
-
<artifactId>shiro-core</artifactId>
-
<version>${shiro-version}</version>
-
</dependency>
-
<dependency>
-
<groupId>org.apache.shiro</groupId>
-
<artifactId>shiro-spring</artifactId>
-
<version>${shiro-version}</version>
-
</dependency>
-
</dependencies>
-
<profiles>
-
<profile>
-
<id>local</id><!-- 本地開發環境 -->
-
<properties>
-
<package.env>local</package.env>
-
</properties>
-
<activation>
-
<activeByDefault>true</activeByDefault>
-
</activation>
-
</profile>
-
<profile>
-
<id>product</id><!-- 生產環境 -->
-
<properties>
-
<package.env>product</package.env>
-
</properties>
-
</profile>
-
</profiles>
-
<build>
-
<finalName>${project.artifactId}</finalName>
-
<resources>
-
<resource>
-
<directory>src/main/resources</directory>
-
<filtering>true</filtering>
-
<excludes>
-
<exclude>local/*</exclude>
-
<exclude>product/*</exclude>
-
</excludes>
-
<includes>
-
<include>public/**/*</include>
-
</includes>
-
</resource>
-
<resource>
-
<directory>src/main/java</directory>
-
<includes>
-
<include>com/wm/back/entity/**/hbm/*.hbm.xml</include>
-
</includes>
-
</resource>
-
</resources>
-
<plugins>
-
<!-- jetty外掛 -->
-
<plugin>
-
<groupId>org.eclipse.jetty</groupId>
-
<artifactId>jetty-maven-plugin</artifactId>
-
<version>9.3.8.v20160314</version>
-
<configuration>
-
<webAppConfig>
-
<contextPath>/</contextPath>
-
<defaultsDescriptor>src/main/resources/public/webdefault.xml</defaultsDescriptor>
-
</webAppConfig>
-
</configuration>
-
</plugin>
-
<plugin>
-
<groupId>org.apache.maven.plugins</groupId>
-
<artifactId>maven-war-plugin</artifactId>
-
<version>2.1.1</version>
-
<configuration>
-
<archive>
-
<addMavenDescriptor>false</addMavenDescriptor>
-
</archive>
-
<warName>${project.artifactId}</warName>
-
<webResources>
-
<!-- 不同的環境,使用不同的配置檔案 -->
-
<resource>
-
<directory>src/main/resources/${package.env}</directory>
-
<targetPath>WEB-INF/classes/${package.env}</targetPath>
-
<filtering>true</filtering>
-
</resource>
-
<!-- 公共的配置檔案 -->
-
<resource>
-
<directory>src/main/resources/public</directory>
-
<!--targetPath用來指定檔案放到哪裡-->
-
<targetPath>WEB-INF/classes/public</targetPath>
-
<filtering>true</filtering>
-
</resource>
-
<resource>
-
<directory>src/main/webapp/WEB-INF/config</directory>
-
<targetPath>WEB-INF</targetPath>
-
<filtering>true</filtering>
-
<includes>
-
<include>web.xml</include>
-
</includes>
-
</resource>
-
</webResources>
-
</configuration>
-
</plugin>
-
</plugins>
-
</build>
-
</project>
先貼出全部程式碼,然後再一一作出解釋
<profiles> <profile> <id>local</id><!-- 本地開發環境 --> <properties> <package.env>local</package.env> </properties> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> <profile> <id>product</id><!-- 生產環境 --> <properties> <package.env>product</package.env> </properties> </profile> </profiles>
properties裡配置的,下文都是可以使用的,我這裡配置package.env ,所以下面使用package.env就是代表local或者product根據我傳入的 -P後面的那個值來決定
打包語句是mvn clean package -P +(我傳入的值 profile的id)來決定package.env的變數
完整的打包語句是mvn clean package -P local
<activeByDefault>true</activeByDefault>
來決定啟用哪個profile
<resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <excludes> <exclude>local/*</exclude> <exclude>product/*</exclude> </excludes> <includes> <include>public/**/*</include> </includes> </resource> <resource> <directory>src/main/java</directory> <includes> <include>com/wm/back/entity/**/hbm/*.hbm.xml</include> </includes> </resource> </resources>
在我的理解下,不加resources的話,所有專案裡的resources檔案都會被載入,但java裡面的配置檔案可能還是載入不了的
但你定義了resources,你就要把你需要通過載入的檔案都要寫出來,不然他不會去載入。
我這裡把各環境的配置檔案都取消了載入,把通用的資原始檔進行了載入。
忘記提一句,這樣下,專案本地啟動的時候會報錯,因為你把local或product都去掉了,程式找不到裡面的檔案。這只是打包的時候才試用
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.1.1</version> <configuration> <archive> <addMavenDescriptor>false</addMavenDescriptor> </archive> <warName>${project.artifactId}</warName> <webResources> <!-- 不同的環境,使用不同的配置檔案 --> <resource> <directory>src/main/resources/${package.env}</directory> <targetPath>WEB-INF/classes/${package.env}</targetPath> <filtering>true</filtering> </resource> <!-- 公共的配置檔案 --> <resource> <directory>src/main/resources/public</directory> <!--targetPath用來指定檔案放到哪裡--> <targetPath>WEB-INF/classes/public</targetPath> <filtering>true</filtering> </resource> <resource> <directory>src/main/webapp/WEB-INF/config</directory> <targetPath>WEB-INF</targetPath> <filtering>true</filtering> <includes> <include>web.xml</include> </includes> </resource> </webResources> </configuration> </plugin>
打war包的時候需要這樣配置
directory:代表你要載入的目錄
targetPath:代表你要把你載入的檔案放在哪裡
<filtering>true</filtering>
這個網上說一定要設定為true,在我看來沒什麼關係,因為我根據命令打包,也能把檔案打出來
<resource> <directory>src/main/webapp/WEB-INF/config</directory> <targetPath>WEB-INF</targetPath> <filtering>true</filtering> <includes> <include>web.xml</include> </includes> </resource>
我這裡是為了把web.xml選擇讀哪個配置檔案給替換掉
為什麼要這樣設計能,因為如果不這樣,我們本地啟動專案,pom是不會吧${package.env}這個替換的。所以這樣會報錯。
但我們打包的時候希望靈活替換。所以就寫一個config檔案目錄,裡面放過web.xml,當要打包的時候替換WEB-INF下的web.xml檔案就可以了
到此,一個完整的流程就走完了