在学习dubbo 分布式框架的时候,需要把一个大的项目分割成多个服务,例如:用户服务模块(包括权限、用户登录、用户增删)、公共服务模块(包括文件上传等),这些服务模块之间可能需要依赖公共的配置文件,例如redis配置、数据库配置、第三方配置,系统数据配置,我们不可能把配置文件在每个需要的服务项目上都放置一份,这样维护起来很麻烦,所以就想把公共的配置文件单独分离处理,做成一个单独的project,然后打成jar包,某个服务需要这个配置的话,直接引用这个jar包就好了。
我的项目结构如下:
项目结构划分:
yt-common: 这个工程包含所有服务公用的工具类、实体对象等。
yt-common-config: 这个是公用的配置工程,这个project只包含配置文件
yt-facade-common:dubbo api 接口,里面定义一些各个服务之间公用的接口方法。
yt-facade-user: dubbo 用户接口API,里面定义了用户服务模块的相关操作。
yt-service-web-common:dubbo 公用服务实现工程,这是web工程,这个里面实现都是yt-facade-common API 里面定义的方法,例如:文件上传服务。
yt-service-web-user: 用户服务实现工程,这个里面都是有关yt-facade-user的实现。
yt-web-clound-sound:这是个后台web工程,包括页面、控制层,会调用dubbo服务去实现业务逻辑功能。
我在 yt-facade-user 里面引入了yt-common-config 的配置,见:
yt-common-config 这个项目的配置文件定义了数据库连接、缓存、系统配置等操作,在yt-facade-user 里面需要这些配置,把项目通过myeclipse 部署到tomcat 下面运行正常,能够访问数据库,yt-common-config 下面定义的配置文件会加载到classpath 下面:
但是问题来了:我利用maven 构建项目,然后把war 包部署到tomcat 下面,运行项目,发现user 服务报错了,我打开tomcat 下面部署的yt-service-web-user项目,发现在classpath下面只有它本身的配置文件,它所依赖的配置文件工程中的配置文件并没有被copy 到classpath下面,所以数据库配置、系统配置都读不到了,然后玩不起来了,我有点想哭。
解决办法:常用的解决办法是百度了,于是乎百度,好在我找到和我有一样想法的童鞋:
1、有人问:maven项目如何依赖另一个项目的配置文件 ,刷刷的看完,然后我再次想哭,没有答案啊。2、有人问:maven 项目拆分配置文件为单独的项目,看到这个我想说还有有人帮我问了,但是拉倒头,发现也只是问了,大神门都不回答啊,好吧,只有靠自己了。
最终的解决办法是:
Maven 打包是由很多插件构成的,我百度的时候发现有这么一个插件:
maven-dependency-plugin插件的使用 ,这个插件是用来项目打包时copy,unpack...jar 包的,对了,unpack,那我可以把配置文件那个jar包解压到classpath下面啊,这样就和myelipse 直接部署的效果一样了,我在yt-facade-user项目的pom.xml 文件配置如下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack</id>
<phase>generate-resources</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>com.hzlh</groupId>
<artifactId>yt-common-config</artifactId>
<version>0.0.1-SNAPSHOT</version>
<type>jar</type>
<overWrite>true</overWrite>
<outputDirectory>${project.build.directory}/classes</outputDirectory>
<includes>**/system/*.properties,**/spring/*.xml</includes>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
这里指定把:yt-common-config 这个jar包解压到项目的classpath下面,并只copy中system、spring文件下面的指定的文件,配置好后,clean-installl 这个project ,查看build后的工程目录:
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack</id>
<phase>generate-resources</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>com.hzlh</groupId>
<artifactId>yt-common-config</artifactId>
<version>0.0.1-SNAPSHOT</version>
<type>jar</type>
<overWrite>true</overWrite>
<outputDirectory>${project.build.directory}/classes</outputDirectory>
<includes>**/system/*.properties,**/spring/*.xml</includes>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
发现配置工程中的配置文件果然解压过来了,然后把war包丢到tomcat中跑起来,顿时我就开心的下班了。
PS:有点啰嗦,但是不要喷我啊!