相信有一些小伙伴会遇到这样的需求:我们希望针对一部分引用定制化jar包的java文件,通过后台代码的方式,将java源文件编译之后并打包成jar包,并最终返回jar包所在的目录,通过FileInputStream的方式,在配置前台就可以将此jar包导出!
在某些特定场景:比如能力开放平台访问SDK,或者定制化RPC框架的客户端SDK,如果我们可以将此客户端远程调用的相关配置文件(比如zk地址,或者token认证代码),一并以数据库的形式配置到前台界面,然后通过此sdk下载的模式,可以快速实现我平台系统和第三方厂家的快速接入使用!
话不多说,下面就上代码!
本组件主要包含三大部分,首先是主方法:
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import javax.tools.*;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* 将源码编译后生成jar包
* @author wenyn
* @since 2020-05-18
*/
public class BmgJarPackageUtil {
private static final Log log = LogFactory.getLog(BmgJarPackageUtil.class);
// 源码路径
private static String source = ApplicationConfig.getVal("bmg.compile.source");
// 打jar包的路径
private static String bin = ApplicationConfig.getVal("bmg.compile.bin");
// 依赖包路径
private static String lib = ApplicationConfig.getVal("bmg.compile.lib");
/**
* 判断字符串是否为空 有值为true 空为:false
*/
private static boolean isnull(String str) {
if (null == str) {
return false;
} else if ("".equals(str)) {
return false;
} else if (str.equals("null")) {
return false;
} else {
return true;
}
}
/**
* 编译java文件
*
* @param encoding 编译编码
* @param jars 需要加载的jar
* @param filePath 文件或者目录(若为目录,自动递归编译)
* @param sourceDir java源文件存放目录
* @param targetDir 编译后class类文件存放目录
* @param diagnostics 存放编译过程中的错误信息
* @return
* @throws Exception
*/
private static boolean compiler(String encoding, String jars, String filePath, String sourceDir, String targetDir, DiagnosticCollector<JavaFileObject> diagnostics, String sign)
throws Exception {
// 获取编译器实例
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
// 获取标准文件管理器实例
StandardJavaFileManager fileManager