之前介绍过JRT最大的特点就是业务脚本化。老javaer就会说你业务代码都在发布环境放着,那怎么代码保密,在发布环境别人随便改了启不是不安全,或者一些代码我就是不想让人看源码呢。
其实JRT的业务脚本化只是特性,不是代表就必须要放源码才能运行。能否运行和有没有源码是没有关系的。源码放着只是保证修改和维护的,你可以为了修改维护方便放源码,也可以为了安全或者不让随意改不放源码。
首先JRT提供一个编译所有业务代码的脚步,浏览器访问就能编译所有业务脚本到jar,当然如果你把所有后台都执行到也不用执行这个全编译脚本,这个只是为了保证全。
调用脚本
有jar之后就可以删任意业务java代码了
删除代码之后不会影响程序执行,这就是JRT的另一面特性
全编译脚本,就是把所有的业务类都获取一遍
import JRT.Core.MultiPlatform.JRTContext;
import JRTBLLBase.BaseHttpHandlerNoSession;
import JRTBLLBase.GetBllObjService;import java.io.File;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;/*** 编译所有的业务类,编译完成后可以删除业务的.java源码使用,在有些时候不想让人看到发布的源码看*/
public class JRTBuild extends BaseHttpHandlerNoSession {/*** 扫描所有业务脚本编译,使JRT的发布可以删除任何业务代码使用* @return*/public String Do(){List<String> exts = new ArrayList<>();exts.add("java");//找到所有的代码文件List<File> files = GetAllPerFileInfo(JRTContext.WebBasePath, exts, "");int num=0;//循环编译每个java代码for(File f:files){String compressedPath = f.getAbsolutePath();//临时目录退出if (compressedPath.contains("AutoBuildTmp")) {continue;}//实体目录退出if (compressedPath.contains("CompileModel")) {continue;}//不编译自己if(f.getName().equals("JRTBuild.java")&&f.getParent().equals("jrtscript")){continue;}System.out.println("编译:" + f.getAbsolutePath());String confStr = compressedPath.replace(JRTContext.WebBasePath, "").replace("\\", "/").split("\\.")[0];try {num++;GetBllObjService.GetObjectByConfString(confStr, null, "", compressedPath);} catch (Exception ex) {ex.printStackTrace();}}return "编译完成,共编译:"+num+"个,所有.java代码已经生成BinAshx,可以删除任意业务.java运行";}/*** 得到目标文件** @param directory* @param extensionList* @param regex* @return*/private static List<File> GetAllPerFileInfo(String directory, List<String> extensionList, String regex) {List<File> paths = new ArrayList<>();File dir = new File(directory);if (!dir.exists()) {// 目录不存在return paths;} else {SeeFile(new File(directory), extensionList, paths, regex);}return paths;}/*** 扫描文件** @param dir 目录* @param extensionList 后缀* @param paths 路径* @param regex 正则*/private static void SeeFile(File dir, List<String> extensionList, List<File> paths, String regex) {File[] files = dir.listFiles();if (files != null) {for (File file : files) {if (file.isDirectory()) {SeeFile(file, extensionList, paths, regex);} else {if (regex != null && !regex.isEmpty()) {if (Pattern.matches(regex, file.getName())) {paths.add(file);}} else if (extensionList != null) {String fileName = file.getName();String fileExtension = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();if (extensionList.contains(fileExtension)) {paths.add(file);}} else {paths.add(file);}}}}}
}