【原创申明:文章为原创,欢迎非盈利性转载,但转载必须注明来源】

在互联网产品中,一般会有多个项目(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项目中静态文件的共享方案的更多相关文章

  1. IDEA的maven项目中 静态文件编译的问题

    IDEA的maven项目中,默认源代码目录下的xml等资源文件并不会在编译的时候一块打包进classes文件夹,而是直接舍弃掉. 如果使用的是Eclipse,Eclipse的src目录下的xml等资源 ...

  2. IDEA的maven项目中静态文件编译的路径问题(未测试)

    转自:http://www.cnblogs.com/signheart/p/6625126.html IDEA的maven项目中,默认源代码目录下的xml等资源文件并不会在编译的时候一块打包进clas ...

  3. jetty项目中静态文件不能修改问题

    修改web.xml 在web.xml中加入如下代码: <servlet> <servlet-name>default</servlet-name> <serv ...

  4. 如何查看.Net源代码vs版本号以及C#项目中各文件的含义

    查看.Net源代码vs版本号以及C#项目中各文件的含义 用记事本打开vs项目的.sln文件. 第2行就是这个源代码包的开发软件vs版本号了 注意了,如果是vs2003的sln文件通常没有这行,可以判断 ...

  5. 对Android项目中的文件夹进行解释

    对Android项目中的文件夹进行解释: · src:里面存放的是Activity程序,或者是以后的其他组件,在此文件夹之中建立类的时候一定要注意,包名称不能是一级. · gen:此文件夹中的内容是自 ...

  6. (转) eclipse项目中.classpath文件详解

    背景:对于java项目中.classpath文件中的相关定义一直不是很了解,有必要进行深入的学习. 1 前言 在使用eclipse或者myeclipse进行Java项目开发的时候,每个project( ...

  7. MyEclipse项目中的文件点击右键Team选项中没有提交到SVN中的选项是怎么回事

    MyEclipse项目中的文件点击右键Team选项中没有提交到SVN中的选项是怎么回事 其实你已经可以百度到很多方法: 例如下面博客提供的 http://www.xuebuyuan.com/95285 ...

  8. Django模板语言中静态文件路径的灵活写法

    如图,我们看到的时html页面中静态文件的路径,其中/static/是settings.py中的设置: 假设我们将settings.py中的/static/改变了,这样的话我们还需要将html中的/s ...

  9. Vue项目中的文件/文件夹命名规范

    Vue项目中的文件/文件夹命名规范 0.2262018.09.21 16:01:09字数 820阅读 6979 文件或文件夹的命名遵循以下原则: index.js 或者 index.vue,统一使用小 ...

随机推荐

  1. 你可能没注意的CSS单位

    扶今追昔 CSS中的单位我们经常用到px.pt.em.百分比,px和pt不用多说 em em是相对单位,参考物是父元素的font-size,具有继承的特点 如果字体大小是16px(浏览器的默认值),那 ...

  2. ABP(现代ASP.NET样板开发框架)系列之15、ABP应用层——应用服务(Application services)

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之15.ABP应用层——应用服务(Application services) ABP是“ASP.NET Boiler ...

  3. MySQL关于exists的一个bug

    今天碰到一个很奇怪的问题,关于exists的, 第一个语句如下: SELECT ) FROM APPLY t WHERE EXISTS ( SELECT r.APPLY_ID FROM RECORD ...

  4. PHP的学习--使用phar打包

    前段时间写了几个PHP的脚本,但是因为脚本的项目是基于composer安装的,给别人使用的时候不太方便,就希望能够打包成一个能直接使用的文件. 搜索了一下,发现可以使用phar打包. 假设我们有如下一 ...

  5. 探寻<a>中的href和onclick

    一.知识点: onclick的方法参数必须加引号 href跳转参数有长度限制 href中执行js会把encodeURIComponent()编码之后的东西自动解码,有时会影响参数传递 a标签中的onc ...

  6. 原创:去繁存简,回归本源:微信小程序公开课信息分析《一》

    以前我开过一些帖子,我们内部也做过一些讨论,我们从张小龙的碎屏图中 ,发现了重要讯息: 1:微信支付将成为重要场景: 2:这些应用与春节关系不小,很多应用在春节时,有重要的场景开启可能性: 3:春节是 ...

  7. ASP.NET Core 中文文档 第三章 原理(6)全球化与本地化

    原文:Globalization and localization 作者:Rick Anderson.Damien Bowden.Bart Calixto.Nadeem Afana 翻译:谢炀(Kil ...

  8. JSONP的诞生、原理及应用实例

    问题: 页面中有一个按钮,点击之后会更新网页中的一个盒子的内容. Ajax可以很容易的满足这种无须刷新整个页面就可以实现数据变换的需求. 但是,Ajax有一个缺点,就是他不允许跨域请求资源. 如果我的 ...

  9. Java进击C#——语法之IO操作

    本章简言 上一章我们对线程同步进行讲解.了解如何去处理可能发生的脏数据.而本章就要讲有关于C#在读取IO文件的时候,常常用到的操作类.这一章的内容会比较少.但是笔者还是总结出来让读者们有一个学习的方向 ...

  10. Attribute操作的性能优化方式

    Attribute是.NET平台上提供的一种元编程能力,可以通过标记的方式来修饰各种成员.无论是组件设计,语言之间互通,还是最普通的框架使 用,现在已经都离不开Attribute了.迫于Attribu ...