多War项目中静态文件的共享方案
【原创申明:文章为原创,欢迎非盈利性转载,但转载必须注明来源】
在互联网产品中,一般会有多个项目(Jar、WAR)组成一个产品线。这些WAR项目,因为使用相同的前端架构(jQuery、easyui等),在各个项目中都会存在这些组件的代码,以及其他各个项目中都要用到的公共资源文件。
传统的做法,在每个War项目中拷贝一份这些文件,分别打包到各个War中。如果这些组件非常稳定,很少升级,也几乎不存在BUG需要修改,这么做问题也不大。但如果是相反的情况,前端人员就要忙疯了,因为他要在各个项目中进行修改调试,而且还要记住哪些项目修改了,哪些还没修改。
针对这一类问题,有什么比较好的处理方法吗?
1 静态文件从War包中独立
不管后续采用哪种方案,这都是必须要做的一个步骤。区别在于独立出来的这些静态文件,采用哪种方法组成一个独立的module。
我们项目中典型的static目录内容如下,其他项目基本类似。
可以看到,其中包括jquery\easyui的代码将会在各个项目中重复出现。
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部署,将静态文件部署到全国各地的机房,用户能够自动访问就近的服务器,能提供更高的访问速度。
不过,这个方案就完全是部署的问题了,项目有需要且公司有钱的可以去尝试。
多War项目中静态文件的共享方案的更多相关文章
- IDEA的maven项目中 静态文件编译的问题
IDEA的maven项目中,默认源代码目录下的xml等资源文件并不会在编译的时候一块打包进classes文件夹,而是直接舍弃掉. 如果使用的是Eclipse,Eclipse的src目录下的xml等资源 ...
- IDEA的maven项目中静态文件编译的路径问题(未测试)
转自:http://www.cnblogs.com/signheart/p/6625126.html IDEA的maven项目中,默认源代码目录下的xml等资源文件并不会在编译的时候一块打包进clas ...
- jetty项目中静态文件不能修改问题
修改web.xml 在web.xml中加入如下代码: <servlet> <servlet-name>default</servlet-name> <serv ...
- 如何查看.Net源代码vs版本号以及C#项目中各文件的含义
查看.Net源代码vs版本号以及C#项目中各文件的含义 用记事本打开vs项目的.sln文件. 第2行就是这个源代码包的开发软件vs版本号了 注意了,如果是vs2003的sln文件通常没有这行,可以判断 ...
- 对Android项目中的文件夹进行解释
对Android项目中的文件夹进行解释: · src:里面存放的是Activity程序,或者是以后的其他组件,在此文件夹之中建立类的时候一定要注意,包名称不能是一级. · gen:此文件夹中的内容是自 ...
- (转) eclipse项目中.classpath文件详解
背景:对于java项目中.classpath文件中的相关定义一直不是很了解,有必要进行深入的学习. 1 前言 在使用eclipse或者myeclipse进行Java项目开发的时候,每个project( ...
- MyEclipse项目中的文件点击右键Team选项中没有提交到SVN中的选项是怎么回事
MyEclipse项目中的文件点击右键Team选项中没有提交到SVN中的选项是怎么回事 其实你已经可以百度到很多方法: 例如下面博客提供的 http://www.xuebuyuan.com/95285 ...
- Django模板语言中静态文件路径的灵活写法
如图,我们看到的时html页面中静态文件的路径,其中/static/是settings.py中的设置: 假设我们将settings.py中的/static/改变了,这样的话我们还需要将html中的/s ...
- Vue项目中的文件/文件夹命名规范
Vue项目中的文件/文件夹命名规范 0.2262018.09.21 16:01:09字数 820阅读 6979 文件或文件夹的命名遵循以下原则: index.js 或者 index.vue,统一使用小 ...
随机推荐
- c += c-- | ++b;
一切都是从这开始的 一个大一学弟通过QQ给我发来一个C++的题: int c = 8, b = 3; c += c-- | ++b; 问c的值是多少.通过笔算得到c为19,然后随手建了个C#控制台项目 ...
- JavaScript语法
通用变量var 强制整数parseint(): 强制小数parsefloat(): 是不是一个合法的数字isNaN(): if(判断条件) { 满足条件要执行的语句 } else{ 不满足条件要执行的 ...
- 关于JavaScript中的delete操作
关于JavaScript中的delete操作 看到一道题,是这样的: (function(x){ delete x; return x; })(1); 1 null undefined Error 我 ...
- C#经典笔试题-获取字符串中相同的字符以及其个数
public Dictionary<char,int> GetStrSameAs(string str){ //将字符串转换成一个字符数组. char[] charArray=str.To ...
- xcode低版本调试高版本真机系统
低版本xcode调试本真机高版本系统 //打开此路径把最新的文件拷贝到这里就可以了 /Applications/Xcode.app/Contents/Developer/Platforms/iPhon ...
- SQL Server-分页方式、ISNULL与COALESCE性能分析(八)
前言 上一节我们讲解了数据类型以及字符串中几个需要注意的地方,这节我们继续讲讲字符串行数同时也讲其他内容和穿插的内容,简短的内容,深入的讲解,Always to review the basics. ...
- 开始学nodejs —— 调试篇
新学习一种技术,肯定会遇到很多坑,我们需要找到这些坑,弄清楚这些坑出现的原因和其中的原理.这种操作就叫做调试. 程序调试的方法和工具多种多样,在这里我总结一下我在学习nodejs的过程中,学到的和用到 ...
- Storm介绍及与Spark Streaming对比
Storm介绍 Storm是由Twitter开源的分布式.高容错的实时处理系统,它的出现令持续不断的流计算变得容易,弥补了Hadoop批处理所不能满足的实时要求.Storm常用于在实时分析.在线机器学 ...
- Vertica集群扩容实验过程记录
需求: 将3个节点的Vertica集群扩容,额外增加3个节点,即扩展到6个节点的Vertica集群. 实验环境: RHEL 6.5 + Vertica 7.2.2-2 步骤: 1.三节点Vertica ...
- C#调用SendMessage 用法
函数功能:该函数将指定的消息发送到一个或多个窗口.此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回.该函数是应用程序和应用程序之间进行消息传递的主要手段之一. 函数原型:LRESUL ...