之前介绍过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);
}
}
}
}
}
}