| | |
| | | import org.apache.commons.lang3.StringUtils; |
| | | |
| | | /** |
| | | * 前三个属性根据实际存储位置设置 |
| | | * 前三个属性根据实际存储位置设置 |
| | | * @author ody.yuan |
| | | * |
| | | */ |
| | | public class MyJsCssVersionUtils { |
| | | |
| | | /** web工程的发布路径 */ |
| | | /** web工程的发布路径 */ |
| | | private static String webContent = "qxueyou"; |
| | | |
| | | /** web工程中web文件夹的绝对路径 D:\project\workspace_web\versioncontroller0\web\js\qxueyou.js */ |
| | | /** web工程中web文件夹的绝对路径 D:\project\workspaceStkkk\qxueyou_web\web\js\qxueyou.js */ |
| | | /** web工程中web文件夹的绝对路径 D:\project\workspace_web\versioncontroller0\web\js\qxueyou.js */ |
| | | /** web工程中web文件夹的绝对路径 D:\project\workspaceStkkk\qxueyou_web\web\js\qxueyou.js */ |
| | | private static String webFileAbsolutePath = "C:" + File.separator + "workspace" + File.separator + "qxueyou_web"; |
| | | |
| | | /** 扫描js、css、html文件的文件夹绝对路径,固定设置为web目录 */ |
| | | /** 扫描js、css、html文件的文件夹绝对路径,固定设置为web目录 */ |
| | | private static String fileScanDirec = "C:" + File.separator + "workspace" + File.separator + "qxueyou_web"; |
| | | |
| | | /** 匹配html中引入js文件 */ |
| | | /** 匹配html中引入js文件 */ |
| | | private static Pattern scriptImportPattrrn = Pattern.compile("<script(.*)src(.*)</script>"); |
| | | |
| | | /** 匹配html中引入css文件 */ |
| | | /** 匹配html中引入css文件 */ |
| | | private static Pattern cssImportPattrrn = Pattern.compile("<link(.*)href(.*)rel(.*)>"); |
| | | |
| | | private static char hexDigits[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; |
| | | |
| | | |
| | | /** |
| | | * 得到处理过的文件路径为key,文件md5值为value的map |
| | | * @param filePath 文件路径 |
| | | * @param fileExtension 文件类型 |
| | | * 得到处理过的文件路径为key,文件md5值为value的map |
| | | * @param filePath 文件路径 |
| | | * @param fileExtension 文件类型 |
| | | * @param map map |
| | | */ |
| | | private static void getFileMD5Map(String filePath,String fileExtension,Map<String,String> map,String version){ |
| | |
| | | } |
| | | |
| | | /** |
| | | * 得到路径下的所需文件和文件的md5值 |
| | | * 得到路径下的所需文件和文件的md5值 |
| | | * @param filePath |
| | | * @param fileExtension |
| | | * @param map |
| | |
| | | File file = new File(filePath); |
| | | if(file.isFile()){ |
| | | String fiePath = file.getAbsolutePath(); |
| | | //符合指定类型 |
| | | //符合指定类型 |
| | | if(fiePath.endsWith(fileExtension)){ |
| | | generateMap(file,fileExtension,map,version); |
| | | } |
| | |
| | | } |
| | | |
| | | /** |
| | | * 得到一个文件的map |
| | | * 得到一个文件的map |
| | | * @param file |
| | | * @param map |
| | | */ |
| | | private static void generateMap(File file, String fileExtension, Map<String,String> map,String version){ |
| | | //TODO 缩短md5值 |
| | | //TODO 缩短md5值 |
| | | String strKey = file.getAbsolutePath(); |
| | | strKey = strKey.replace(webFileAbsolutePath, File.separator + webContent); |
| | | strKey = strKey.replace("\\", "/"); |
| | |
| | | } |
| | | |
| | | /** |
| | | * 对文件全文生成MD5摘要 |
| | | * 对文件全文生成MD5摘要 |
| | | * |
| | | * @param file |
| | | * 要加密的文件 |
| | | * @return MD5摘要码 |
| | | * 要加密的文件 |
| | | * @return MD5摘要码 |
| | | */ |
| | | public static String getMD5(File file) { |
| | | FileInputStream fis = null; |
| | |
| | | fis = new FileInputStream(file); |
| | | byte[] buffer = new byte[2048]; |
| | | int length = -1; |
| | | //暂时不用 |
| | | //暂时不用 |
| | | //long s = System.currentTimeMillis(); |
| | | while ((length = fis.read(buffer)) != -1) { |
| | | md.update(buffer, 0, length); |
| | | } |
| | | byte[] b = md.digest(); |
| | | return byteToHexString(b); |
| | | // 16位加密 |
| | | // 16位加密 |
| | | // return buf.toString().substring(8, 24); |
| | | } catch (Exception ex) { |
| | | ex.printStackTrace(); |
| | |
| | | } |
| | | |
| | | /** |
| | | * 把byte[]数组转换成十六进制字符串表示形式 |
| | | * @param tmp 要转换的byte[] |
| | | * @return 十六进制字符串表示形式 |
| | | * 把byte[]数组转换成十六进制字符串表示形式 |
| | | * @param tmp 要转换的byte[] |
| | | * @return 十六进制字符串表示形式 |
| | | */ |
| | | private static String byteToHexString(byte[] tmp) { |
| | | |
| | | String s; |
| | | // 用字节表示就是 16 个字节 |
| | | char str[] = new char[16 * 2]; // 每个字节用 16 进制表示的话,使用两个字符, |
| | | // 所以表示成 16 进制需要 32 个字符 |
| | | int k = 0; // 表示转换结果中对应的字符位置 |
| | | for (int i = 0; i < 16; i++) { // 从第一个字节开始,对 MD5 的每一个字节 |
| | | // 转换成 16 进制字符的转换 |
| | | byte byte0 = tmp[i]; // 取第 i 个字节 |
| | | str[k++] = hexDigits[byte0 >>> 4 & 0xf]; // 取字节中高 4 位的数字转换, |
| | | // >>> 为逻辑右移,将符号位一起右移 |
| | | str[k++] = hexDigits[byte0 & 0xf]; // 取字节中低 4 位的数字转换 |
| | | // 用字节表示就是 16 个字节 |
| | | char str[] = new char[16 * 2]; // 每个字节用 16 进制表示的话,使用两个字符, |
| | | // 所以表示成 16 进制需要 32 个字符 |
| | | int k = 0; // 表示转换结果中对应的字符位置 |
| | | for (int i = 0; i < 16; i++) { // 从第一个字节开始,对 MD5 的每一个字节 |
| | | // 转换成 16 进制字符的转换 |
| | | byte byte0 = tmp[i]; // 取第 i 个字节 |
| | | str[k++] = hexDigits[byte0 >>> 4 & 0xf]; // 取字节中高 4 位的数字转换, |
| | | // >>> 为逻辑右移,将符号位一起右移 |
| | | str[k++] = hexDigits[byte0 & 0xf]; // 取字节中低 4 位的数字转换 |
| | | } |
| | | s = new String(str); // 换后的结果转换为字符串 |
| | | s = new String(str); // 换后的结果转换为字符串 |
| | | return s; |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | /** |
| | | * 得到路径下的所需文件和文件的md5值 |
| | | * 得到路径下的所需文件和文件的md5值 |
| | | * @param filePath |
| | | * @param fileExtension |
| | | * @param map |
| | |
| | | File file = new File(filePath); |
| | | if(file.isFile()){ |
| | | String fiePath = file.getAbsolutePath(); |
| | | //符合指定类型 |
| | | //符合指定类型 |
| | | if(fiePath.endsWith(fileExtension)){ |
| | | addVersion(file,map); |
| | | } |
| | |
| | | } |
| | | |
| | | /** |
| | | * 得到一个文件的map |
| | | * 得到一个文件的map |
| | | * @param file |
| | | * @param map |
| | | */ |
| | | private static void addVersion(File file,Map<String,String> map){ |
| | | //TODO 缩短md5值 |
| | | //TODO 缩短md5值 |
| | | InputStream is = null; |
| | | OutputStream os = null; |
| | | List<String> contentList = new ArrayList<String>(); |
| | | |
| | | // 读文件 |
| | | // 读文件 |
| | | try { |
| | | //指定utf-8格式 |
| | | //指定utf-8格式 |
| | | BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), "utf-8")); |
| | | String line = null; |
| | | |
| | | while ((line = br.readLine()) != null) { |
| | | //TODO version 传null值 |
| | | //TODO version 传null值 |
| | | String modLine = getModLine(line, null,map); |
| | | if (modLine != null) { |
| | | //System.out.println(modLine); |
| | |
| | | line = line + "\r\n"; |
| | | contentList.add(line); |
| | | } |
| | | // 关闭流 |
| | | // 关闭流 |
| | | br.close(); |
| | | } catch (Exception e) { |
| | | System.out.println("读文件失败:" + file.getAbsolutePath()); |
| | | System.out.println("读文件失败:" + file.getAbsolutePath()); |
| | | e.printStackTrace(); |
| | | } finally { |
| | | if (null != is) { |
| | |
| | | } |
| | | |
| | | } |
| | | // 写文件 |
| | | // 写文件 |
| | | try { |
| | | //指定utf8格式 |
| | | //指定utf8格式 |
| | | BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file),"utf-8")); |
| | | |
| | | for (Iterator<String> it = contentList.iterator(); it.hasNext();) { |
| | | String line = it.next(); |
| | | bw.write(line); |
| | | } |
| | | // 更新到文件 |
| | | // 更新到文件 |
| | | bw.flush(); |
| | | // 关闭流 |
| | | // 关闭流 |
| | | bw.close(); |
| | | } catch (Exception e) { |
| | | System.out.println("写文件失败:" + file.getAbsolutePath()); |
| | | System.out.println("写文件失败:" + file.getAbsolutePath()); |
| | | e.printStackTrace(); |
| | | } finally { |
| | | if (null != os) { |
| | |
| | | |
| | | /** |
| | | * |
| | | * 查找文件需要的版本号的js 与css 行 |
| | | * @param line 行字符 |
| | | * @param version 默认版本 |
| | | * 查找文件需要的版本号的js 与css 行 |
| | | * @param line 行字符 |
| | | * @param version 默认版本 |
| | | * @param map md5 map |
| | | * @return |
| | | */ |
| | | private static String getModLine(String line, String version, Map<String, String> map) { |
| | | |
| | | //匹配html引入js文件 eg:<script type="text/javascript" src="/qxueyou/web/js/qxueyou.js"></script> |
| | | //匹配html引入js文件 eg:<script type="text/javascript" src="/qxueyou/web/js/qxueyou.js"></script> |
| | | if (scriptImportPattrrn.matcher(line).find()) { |
| | | //以引号分隔,以/开始 |
| | | //以引号分隔,以/开始 |
| | | String md5Version = null; |
| | | String strLine[] = line.split("\""); |
| | | for(String str:strLine){ |
| | |
| | | break; |
| | | } |
| | | if(str.startsWith("/")){ |
| | | //如果已有版本号,按?分隔,取第一个 |
| | | //如果已有版本号,按?分隔,取第一个 |
| | | if(str.lastIndexOf("?version") != -1){ |
| | | str = str.substring(0, str.lastIndexOf("?version")); |
| | | } |
| | |
| | | return modLine; |
| | | } |
| | | |
| | | //匹配html引入css文件 eg:<link href="/qxueyou/web/css/bootstrap.min.css" rel="stylesheet"> |
| | | //匹配html引入css文件 eg:<link href="/qxueyou/web/css/bootstrap.min.css" rel="stylesheet"> |
| | | } else if (cssImportPattrrn.matcher(line).find()) { |
| | | |
| | | //以引号分隔,以/开始 |
| | | //以引号分隔,以/开始 |
| | | String md5Version = null; |
| | | String strLine[] = line.split("\""); |
| | | for(String str:strLine){ |
| | |
| | | break; |
| | | } |
| | | if(str.startsWith("/")){ |
| | | //如果已有版本号,按?分隔,取第一个 |
| | | //如果已有版本号,按?分隔,取第一个 |
| | | if(str.lastIndexOf("?version") != -1){ |
| | | str = str.substring(0, str.lastIndexOf("?version")); |
| | | } |
| | |
| | | String version = df.format(date); |
| | | |
| | | Map<String,String> objMap = new HashMap<String,String>(); |
| | | //添加js文件 |
| | | //添加js文件 |
| | | getFileMD5Map(fileScanDirec,".js",objMap,version); |
| | | //添加CSS文件 |
| | | //添加CSS文件 |
| | | getFileMD5Map(fileScanDirec,".css",objMap,version); |
| | | |
| | | //循环html文件,修改其中的css和js引入路径 |
| | | //循环html文件,修改其中的css和js引入路径 |
| | | getHtml(fileScanDirec,".ftl",objMap); |
| | | |
| | | System.out.println("successful"); |