前几年大多数时间,都是在做PC版的j2ee项目。
但随着移动互联的崛起,随即也转战到了微信公众号,移动端的开发。
网页缓存,以前一直知道,却没有去尝试解决的问题。觉得在PC端用户刷刷页面就能解决的事情,我们就没必要去瞎折腾(此处已安装防喷防火墙)。然后现在到了移动互联,比如移动端的各个浏览器,没有了强制刷新功能,也不可能要求用户卸载微信,清理数据。让用户做了这些,不知道早已损失了多少用户。所以才有了现在这篇文章。在网上搜集这零散的资料,然后来解决这个问题。对于不正确或有更好的做法,请各位大神指正!非常感谢!
解决了那些问题?举例说明吧。比如项目中有一个文件 /js/jquery.js .当我们修改了以后,客户端再次访问不会刷新jquery.js的已修改的内容,而使用的旧版的代码。解决方案原理:构建时,生成一个md5码,并追加在jquery.js上,构建后的jquery.js名称变更为jquery-E87J39.js 类似这样。每次修改后,MD5码都不一样。同时,插件还会替换jsp里面的 /js/jquery.js 路径为 /js/jquery-E87J39.js.保证用户下次请求到的文件是新的。CSS文件、图片等静态资源文件处理原理一致。
标题也提到了。j2ee,maven结构。因为目前很多项目都是这样,java代码与前端代码混合开发,java程序猿要懂得html并编写jsp.这也是一种流行编码方式。其他更多的不再赘述。
1.构建用到的maven插件,frontend-maven-plugin,antrun
2. 前端构建工具 gulp
更多资料也可以搜索上面的关键词并查看相关资料。
下面是我这次构建的相关代码.
pom.xml增加构建插件
<properties> <project.build.frontend.version>1.0</project.build.frontend.version> <project.build.node.version>v0.12.4</project.build.node.version> <project.build.npm.version>1.4.9</project.build.npm.version> </properties> <plugin> <groupId>com.github.eirslett</groupId> <artifactId>frontend-maven-plugin</artifactId> <version>${project.build.frontend.version}</version> <executions> <execution> <id>install node and npm</id> <phase>prepare-package</phase> <goals> <goal>install-node-and-npm</goal> </goals> <configuration> <nodeVersion>${project.build.node.version}</nodeVersion> <npmVersion>${project.build.npm.version}</npmVersion> <installDirectory></installDirectory> </configuration> </execution> <execution> <id>npm install</id> <phase>prepare-package</phase> <goals> <goal>npm</goal> </goals> <configuration> <arguments>install</arguments> </configuration> </execution> <execution> <id>gulp build</id> <goals> <goal>gulp</goal> </goals> <phase>prepare-package</phase> <configuration> </configuration> </execution> </executions> </plugin>
项目根目录增加,package.json,gulpfile.js.
package.json内容:
{ "name": "example", "version": "0.0.1", "dependencies": { "gulp": "^3.9.0", "gulp-rev": "7.1.2", "gulp-rev-collector": "1.0.5", "run-sequence": "1.2.2", "gulp-clean": "0.3.2", "gulp-clean-css": "2.0.12", "gulp-uglify":"2.0.0", "pump" : "1.0.1", "gulp-htmlclean":"2.7.6" }, "jspm": { "dependencies": { "jquery": "github:jquery/jquery@^2.1.3" }, "devDependencies": { "traceur": "github:jmcriffey/bower-traceur@0.0.88", "traceur-runtime": "github:jmcriffey/bower-traceur-runtime@0.0.88" } }, "scripts": { "prebuild": "npm install", "build": "gulp" }, "devDependencies": { "gulp": "^3.9.1", "gulp-clean": "^0.3.2", "gulp-rev": "^7.1.2", "gulp-rev-collector": "^1.0.5", "run-sequence": "^1.2.2" } }
gulpfile.js文件内容:
var gulp = require('gulp'), rev = require('gulp-rev'), revCollector = require('gulp-rev-collector'), runSequence = require('run-sequence'), clean = require('gulp-clean'), cleanCSS = require('gulp-clean-css'), uglify = require('gulp-uglify'), pump = require('pump'), htmlclean = require('gulp-htmlclean');; gulp.task('clean',function(){ return gulp.src('dist',{read:false}).pipe(clean()); }); gulp.task('clean_tmp',function(){ return gulp.src('dist_tmp',{read:false}).pipe(clean()); }); gulp.task('minify-css', function() { return gulp.src('src/main/webapp/**/*.css') .pipe(cleanCSS({compatibility: 'ie8'})) .pipe(gulp.dest('dist_tmp/')); }); gulp.task('css',['minify-css'], function (cb) { return gulp.src('dist_tmp/**/*.css') .pipe(rev()) .pipe(gulp.dest('dist/')) .pipe( rev.manifest() ) .pipe( gulp.dest( 'dist/rev/css' ) ); }); gulp.task('compress', function (cb) { pump([ gulp.src('src/main/webapp/**/*.js'), uglify(), gulp.dest('dist_tmp/') ], cb ); }); gulp.task('scripts',['compress'], function () { return gulp.src(['dist_tmp/**/jquery.js']) .pipe(rev()) .pipe(gulp.dest('dist/')) .pipe( rev.manifest() ) .pipe( gulp.dest( 'dist/rev/js' ) ); }); gulp.task('rev',function(){ return gulp.src(['dist/rev/**/*.json','src/main/webapp/WEB-INF/views/**/*.jsp']) .pipe(revCollector({ replaceReved: true })) .pipe(gulp.dest('dist/WEB-INF/views/')); }); gulp.task('minify', function() { return gulp.src('dist/WEB-INF/views/**/*.jsp') .pipe(htmlclean()) .pipe(gulp.dest('dist/WEB-INF/views/')); }); gulp.task('default',function(){ runSequence('clean','clean_tmp','css','scripts','rev','minify'); });
增加了这些文件,install的时候,就会进行前端构建,但这还不够,目前这里仅仅是把对应的css,js,html构件号了,并没有通过maven-war-plugin 构建到war中。所以还需要增加war包配置
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.3</version> <configuration> <warName>xxx</warName> <webResources> <resource> <!-- this is relative to the pom.xml directory --> <directory>dist</directory> <includes> <include>**/*.css</include> <include>**/*.js</include> <include>**/*.jsp</include> <include>**/*.jpg</include> <include>**/*.png</include> <include>**/*.gif</include> <include>**/*.jpeg</include> </includes> </resource> <resource> <!-- this is relative to the pom.xml directory --> <directory>dist_tmp</directory> <includes> <include>**/*.js</include> </includes> </resource> </webResources> <packagingExcludes></packagingExcludes> <!-- 过滤静态资源文件和jsp,这些文件来自已处理过的dist文件夹 --> <!-- <warSourceExcludes>**/*.css,**/*.js,**/*.jsp,**/*.jpg,**/*.png,**/*.gif,**/*.jpeg</warSourceExcludes> --> <warSourceExcludes>**/*.css,**/*.js,**/*.jsp</warSourceExcludes> </configuration> </plugin>
目前做完这些,一个可用的war包就出来了。
其他问题:
1. 每次构建都会下载构建资源,所以,我的做法是第一次构建我完成后,我把相关的资源打了个包。然后在构建前,用antrun插件,将其解压出来到项目下面就可以不用下载啦。
<plugin> <artifactId>maven-antrun-plugin</artifactId> <version>1.8</version> <executions> <execution> <phase>validate</phase> <configuration> <tasks> <echo message="unzipping file" /> <unzip src="D:/gulp/gulp.zip" dest="./" /> </tasks> </configuration> <goals> <goal>run</goal> </goals> </execution> </executions> </plugin>
gulp.zip 这个文件我就放上来了,因为第一次成功构建以后,在项目下面会有,主要是根目录下node和node_modules这两个目录打包了成gulp.zip
2.无法替换jsp中已转换过的js文件。在大多数情况下,我们的路径是${ctx}/js/jquery.js或${ctx}/css/style.css这样。但前端构建似乎不是这样。错误原因是匹配路径与我们想要的有一点出入。所以,我们就需要修改下面插件的代码。
需要修改的插件是:gulp-rev-collector里面的Index.js。这个文件我放附件吧。
3.js文件没有增加md5串或替换,请看看您的配置是否正确。请检查下gulpfile.js中"scripts"是否包含你的js。因为我们这边是有固定有些才替换,所以才有这个配置,如果你期望是全部的js都参与加密替换,可以考虑配置成dist_tmp/**/*.js
相关推荐
在本项目中,我们利用Jenkins、Maven、Gitlab和Tomcat这四个工具实现了一个完整的自动化工作流。 首先,让我们来详细了解这些工具及其在自动化过程中的作用: 1. **Jenkins**:Jenkins 是一个开源的持续集成(CI)...
Apache Maven是Java开发领域广泛应用的一款项目管理工具,它基于项目对象模型(Project Object Model, POM)的概念,能够自动化构建、依赖管理和项目信息管理。在本文中,我们将深入探讨Maven 3.9.6这一版本,以及它...
《尚硅谷自动化构建工具Maven视频源码课件》是一份深入学习Maven的宝贵资源,旨在帮助开发者全面掌握这个强大的Java项目管理工具。Maven是Apache软件基金会开发的一个项目管理和综合工具,它通过一个标准化的构建...
Maven是一个广泛使用的Java项目管理和构建自动化工具,它基于项目对象模型(POM)的概念,能够管理项目的生命周期,包括编译、测试、打包、发布等。Maven使得开发者可以更加专注于代码的编写,而不是繁琐的构建过程...
java视频教程之SVN Maven搭建自动化构建教程 Eclipse中使用Maven视频教程云盘下载链接
3. 可视化方式项目构建 IDEA提供了图形化的Maven工具窗口,可以直观地查看和运行Maven构建目标。 4. 构建插件、命令、生命周期命令之间关系 Maven的构建过程由插件执行,插件绑定了生命周期的不同阶段。例如,maven...
【标题】"Hudson SVN Maven 自动构建"指的是在持续集成环境中使用Hudson(现在称为Jenkins)作为工具,结合Subversion(SVN)作为版本控制系统,Maven作为项目管理和构建工具,实现代码的自动构建过程。这个流程的...
Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。
Maven作为Java领域广泛使用的构建工具,提供了强大的支持来管理多模块项目。本文将深入探讨如何利用Maven构建多模块项目,以及在实际操作中需要注意的关键点。 1. Maven多模块项目结构: Maven多模块项目通常遵循...
Maven可以与Jenkins、GitLab CI/CD等工具结合,实现自动化构建、测试和部署,确保快速反馈和稳定运行。 8. **分布式配置管理**:在大型分布式系统中,配置管理是个挑战。Spring Cloud Config或HashiCorp Consul等...
在Java开发领域,Maven是被广泛推荐的项目构建工具,尤其受到许多Java大神的推崇。Maven通过提供一个标准化的项目结构和自动化构建流程,极大地简化了项目的管理与维护,同时也使得团队协作变得更加高效。 Maven的...
Maven是Java开发领域的项目管理和构建自动化工具,它基于项目对象模型(POM)的概念,通过配置文件(pom.xml)来管理项目的构建、报告和文档。Maven能够处理项目的依赖关系,自动下载所需的库和插件,并提供了一套...
Maven是Java项目中最流行的事实上的构建和管理工具。Maven 基于项目对象模型 (POM) 的概念,它有助于从中心信息自动管理项目的生成、文档和报告。 多年来,Maven变得非常流行,它定义了用于构建软件的通用接口。...
在IT行业中,J2EE(Java 2 Platform, Enterprise Edition...同时,Maven的插件体系也使得集成各种工具和自动化任务变得轻松,进一步提升了开发体验。结合源码管理和版本控制工具,如Git,一个完整的开发流程得以形成。
在IT行业中,构建工具是开发过程中的重要环节,它们帮助我们自动化处理编译、测试、打包等任务。本文将深入探讨Maven如何用于构建Kettle项目,并解析与之相关的jar包的重要性。 首先,Maven是一个广泛使用的Java...
Maven是一个基于项目对象模型(POM)的项目管理和自动化构建工具,主要服务于Java平台的项目。它对项目的构建过程进行了抽象,为开发者提供了一套完整的构建生命周期框架。Maven不仅能够执行编译、测试、打包等基本...
通过结合Maven、Nexus和Eclipse,开发者能够构建高效且可复用的J2EE项目,实现标准化的开发流程,提高代码质量,并确保依赖管理的稳定性。学习并掌握这些工具的使用,对于任何J2EE开发者来说都是极其重要的技能。
Jmeter+maven+Jenkins构建云性能测试平台 标题分析: 本文标题“Jmeter+maven+Jenkins构建云性能测试平台”表明了本文的主题,即使用Jmeter、Maven和Jenkins来构建一个云性能测试平台。这个标题涵盖了三个关键技术...
Apache Maven是Java开发领域广泛应用的项目管理和综合工具,它的核心理念是通过项目对象模型(Project Object Model,POM)来管理项目的构建、报告和依赖关系。Maven v3.6.3是该工具的一个稳定版本,它包含了众多的...