【原创申明:文章为原创,欢迎非盈利性转载,但转载必须注明来源】
在互联网产品中,一般会有多个项目(Jar、WAR)组成一个产品线。这些WAR项目,因为使用相同的前端架构(jQuery、easyui等),在各个项目中都会存在这些组件的代码,以及其他各个项目中都要用到的公共资源文件。
传统的做法,在每个War项目中拷贝一份这些文件,分别打包到各个War中。如果这些组件非常稳定,很少升级,也几乎不存在BUG需要修改,这么做问题也不大。但如果是相反的情况,前端人员就要忙疯了,因为他要在各个项目中进行修改调试,而且还要记住哪些项目修改了,哪些还没修改。
针对这一类问题,有什么比较好的处理方法吗?
1 静态文件从War包中独立
不管后续采用哪种方案,这都是必须要做的一个步骤。区别在于独立出来的这些静态文件,采用哪种方法组成一个独立的module。
我们项目中典型的static目录内容如下,其他项目基本类似。
可以看到,其中包括jqueryeasyui的代码将会在各个项目中重复出现。
2 将静态文件作为独立jar包开发
将资源文件独立出来后,使用一个独立的jar包进行开发;其他war项目依赖这个jar包。
2.1 静态文件jar项目
在项目的src/main/resources目录中创建static目录,并将公共静态文件复制到该目录中。
修改pom.xml文件,配置私有maven库的地址和用户信息,这样mvn deploy可以自动将jar发布到maven库,供其它war项目使用。
2.2 War包项目引用
首先修改pom.xml,添加dependency。
<dependency> <groupId>cn.codestory.research</groupId> <artifactId>common-static</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> |
然后修改spring配置文件中的mvc:resources部分为
<mvc:resources mapping="/static/**" location="classpath:/static/" /> |
页面引用静态文件时,直接使用代码
<script type="text/javascript" src='/static/javascript/framework/jquery.min.js'></script> <script type="text/javascript" src='/static/javascript/framework/jquery.easyui.min.js'></script> |
这样就能正常访问jar包中的静态文件。
如果war包中需要添加本项目特有的静态文件,或者是对jar中的部分静态文件做修改适应本项目的需要,可以保存在war项目的目录中/src/main/resources/static中,其他代码都不需要修改。
如果原war中的静态文件保存在src/main/webapp/static目录中并且不想移动这些文件,修改spring配置文件中的mvc:resources内容为
<mvc:resources mapping="/static/**" location="classpath:/static/,/static/" /> |
2.3 小结
这种修改方法,不修改项目的部署方式就能实现静态文件的共享。只是它需要构建一个私有Maven仓库,在项目之间共享才比较方便。
前端修改代码时,只需要在common-static.jar项目中修改即可。当然,因为涉及到更多的项目,修改也一定要慎重。这可以通过升级jar版本号的方法来实现各个war项目的逐渐升级。
3 静态文件作为独立WAR,依靠部署来实现
在生产环境,将静态文件独立部署到一台服务器,采用Tomcat或Http Server。有两种方案可以实现static文件的转发。
3.1 nginx根据URI地址进行转发
这种方式对项目的修改比较少,也不需要增加新的域名,下图中可设置转发规则:
1、uri是/static/**,则一律转发到static server
2、host是app1.codestory.cn,转发到app server 1
3、host是app2.codestory.cn,转发到app server 2
3.2 静态文件服务器申请独立域名
部署方案跟前面类似,区别在于转发规则的设置。同时,在war包中的script引用路径必须包括host的完整URL。
<script type="text/javascript" src='http://static.codestory.cn/static/javascript/framework/jquery.min.js'></script> |
3.3 应用CDN部署静态文件项目
更进一步的解决方案,是使用CDN部署,将静态文件部署到全国各地的机房,用户能够自动访问就近的服务器,能提供更高的访问速度。
不过,这个方案就完全是部署的问题了,项目有需要且公司有钱的可以去尝试。