互联网和以前的模式是有区别的,以前我们都是给每个公司搭建一套系统,买产品那就是还有买一整套的服务器硬件等,然后在内部网络搭建系统,可是现在互联网则不一样了,我们只有一套系统,客户要买我们的产品,我们也只是卖服务而已,所有客户都使用一套系统,因为权限和位置不同所以只能看到自己的数据。对于以前的部署方式,因为有很多客户,每个客户的环境都不一样,如果我们项目的配置文件是写在项目内部的话,那么要根据不同的客户打不同的包,这个太麻烦了,所以就把配置文件ini放在了某个固定的路径下面,使配置文件和项目解耦,客户可以自己使用配置文件配置;回到现在,因为我们项目部署在云端,一般情况下就部署一处搞定,然后再细分环境就是 生产环境、测试环境、开发环境,所以只要根据这3个不同的环境打3次包即可,那么就没必要把配置文件放在项目外部了,而是放在项目内部,使用项目 Maven 管理。
使用Maven根据不同环境打包,maven项目都会有 src/main/java src/main/resources
前者存放的是java源文件,默认打包在 classes 目录下面,但是如果该目录下面还有非java的文件,系统默认是不会打包的,这个时候除非自己指定POM文件打包规则;
后面存放的是配置文件,同样maven默认打包在classes目录下,默认是所有文件,所以,如果想要部分文件不打包,你们也要自己指定POM文件打包规则。
规则——核心资源过滤
1)项目目录结构
src/main/java
|-LoginServlet.java
|-UserMapper.xml
src/main/resources
|-config
|-jdbc.properties
|-enviroment
|-dev.properties
|-product.properties
|-test.properties
2)jdbc.propertes 文件内容
driverClassName=${driverClassName}
jdbc_url=${jdbc_url}
jdbc_user=${jdbc_user}
jdbc_password=${jdbc_password}
3)修改pom文件
................
<build>
<!-- 单元测试,忽略 Tests are skipped -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.5</version>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
<!-- 配置文件,,resources 目录则恰好相反 -->
<resources>
<!-- 如果在java目录下有资源文件,需要明确声明打包才能部署到classes目录 -->
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<!-- 如果在resouces目录下有资源文件,需要明确声明打包才能不部署到classes目录 -->
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<includes>
<include>**/*.*</include>
</includes>
<excludes>
<exclude>environment/*.properties</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
</build>
<!-- 配置选项 dev 开发环境(默认使用),test 测试环境,product 生产环境 -->
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<driverClassName>com.mysql.jdbc.Driver</driverClassName>
<jdbc_url>jdbc:mysql://localhost:3306/develop</jdbc_url>
<jdbc_user>learnmore</jdbc_user>
<jdbc_password>learnmore</jdbc_password>
</properties>
</profile>
<profile>
<id>product</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<!-- 使用自定义属性的方式 -->
<driverClassName>com.mysql.jdbc.Driver</driverClassName>
<jdbc_url>jdbc:mysql://localhost:3306/product</jdbc_url>
<jdbc_user>learnmore</jdbc_user>
<jdbc_password>learnmore</jdbc_password>
</properties>
</profile>
<profile>
<id>test</id>
<build>
<filters>
<!-- 使用独立文件的方式 -->
<filter>src/main/resources/environment/test.properties</filter>
</filters>
</build>
</profile>
</profiles>
无论是src/main/java 还是 src/main/resources 他们都可以放资源文件,在pom中都可以设置属性 include 和 exclude ,不要以为 include和exclude就是部署时是否包含,其实还有另外的意思,他们更关键的是配合另一个属性 filtering 使用,filtering 为 true 说明 include 的文件会被资源过滤,也就是这些文件内部的占位符 ${jdbc_url} 会被 profiles 中指定的 properties 替换掉,打包之后你就可以打开war包看到效果。然而打包部署的话,是有默认规则的,就是上面说的,如果是在 src/main/java 目录下,非java文件默认不打包,但是如果在pom中声明要include,那么这部分就会打包;如果是 src/main/resource 目录下,所有的文件都默认打包在classes目录,但是如果在pom中声明要exclude,那么这部分就不打包。看上面的配置你会发现,resources目录下指定了多个 resource ,第一个是用来声明需要部署哪些文件,第二个用来声明哪些文件需要过滤。
4)上面默认是激活dev配置,我们也可以在打包时采用参数激活自定义的文件
mvn clean package
mvn clean package -Pdev
mvn clean package -Pproduct
mvn clean package -Ptest
打包之后,找到war包,然后查看文件,会发现占位符已经被替换。
jdbc.propertes 文件内容
driverClassName=com.mysql.jdbc.Driver
jdbc_url=jdbc:mysql://localhost:3306/product
jdbc_user=learnmore
jdbc_password=learnmore
对于profile激活机制还是有很多的,这个可以参考《Mavn实战》
对于maven属性自定义以及系统maven属性,都可以参考 《Mavn实战》