最近接触到公司一个项目,需要将生成的源码动态编译,记录下学习过程。

先贴出官网推荐写法:

JavaCompiler.CompilationTask getTask(Writer out,
                                     JavaFileManager fileManager,
                                     DiagnosticListener<? super JavaFileObject> diagnosticListener,
                                     Iterable<String> options,
                                     Iterable<String> classes,
                                     Iterable<? extends JavaFileObject> compilationUnits)

参数:out - 用于来自编译器的其他输出的 Writer;如果为 null,则使用 System.err

  fileManager - 文件管理器;如果为 null,则使用编译器的标准文件管理器 

    标准文件管理器有两个用途:

    • 自定义编译器如何读写文件的基本构建块

      •  在多个编译任务之间共享

  diagnosticListener - 诊断侦听器;如果为 null,则使用编译器的默认方法报告诊断信息

  options - 编译器选项; null 表示没有选项

  classes - 类名称(用于注释处理), null 表示没有类名称

  compilationUnits - 要编译的编译单元; null 表示没有编译单元

Files[] files1 = ...; // input for first compilation task
Files[] files2 = ...; // input for second compilation task

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

//DiagnosticCollector为诊断侦听器,用于将诊断信息收集在一个列表中

//可以不设置,为null时默认使用system.err

DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null);
//自定义编译器读写文件的基本构件块
Iterable<? extends JavaFileObject> compilationUnits1 = fileManager.getJavaFileObjectsFromFiles(Arrays.asList(files1));
compiler.getTask(null, fileManager, diagnostics, null, null, compilationUnits1).call();

Iterable<? extends JavaFileObject> compilationUnits2 =  fileManager.getJavaFileObjects(files2); // use alternative method
// reuse the same file manager to allow caching of jar files
compiler.getTask(null, fileManager, null, null, null, compilationUnits2).call();

for (Diagnostic diagnostic :diagnostics.getDiagnostics())
System.out.format("Error on line %d in %d%n",
diagnostic.getLineNumber()
diagnostic.getSource().toUri());

fileManager.close();

记录下自己的一段代码:

public static void main(String[] args) {

//class文件生成目录
  String targetPath="D:\\generate\\target";

//源文件目录
  String sourcePath="D:\\generate\\source";
  File sourceFile=new File(sourcePath);
  List<File> sourceFiles = new ArrayList<File>();
  compiler(sourceFile,targetPath,sourceFiles);
  boolean result = compilerJavaFile(sourceFiles, targetPath);
  System.out.println("compiler finish!" + result);
 }

/**
  * 递归获取java文件
  * @param file 需要编译的文件夹
  * @param targetPath 编译后class类文件存放目录
  */
 public static void compiler(File file,String targetPath,List<File> sourceFiles) {
     File targetDir = new File(targetPath);
     if (! targetDir.exists())
     {
         targetDir.mkdirs();
     }
    if (file != null && file.exists()){
     File[] listFiles = file.listFiles();
     if (null == listFiles || listFiles.length == 0) {
        return;
     }
     for (File file2 : listFiles) {
        // 判断是否是文件夹
        if (file2.isDirectory()) {
             compiler(file2,targetPath,sourceFiles);
        } else {
           if (file2.getName().endsWith(".java")) {
           //将源文件目录中的Java文件加入集合中
             sourceFiles.add(file2);
         }
      }
    }
      }else{
        System.out.println("传入格式未知文件");
      }
 }

/**
  * 编译java文件
  * @param sourcePath
  * @param targerPath
  * @return
  */
 public static boolean compilerJavaFile(List<File> sourceFile, String targerPath) {

    StandardJavaFileManager fileManager = getJavaCompiler().getStandardFileManager(null, null, null);
    Iterable<? extends JavaFileObject> compilationUnits = fileManager.getJavaFileObjectsFromFiles(sourceFile);
    return getJavaCompiler().getTask(null, fileManager, null, options, null, compilationUnits).call();

}

最新文章

  1. mysql常见错误及解决方案
  2. Emgu CV 高斯建模
  3. jacob 操作word
  4. Java_1Lesson
  5. MSSQL - 存储过程Return返回值
  6. Loadrunner 网页诊断图
  7. formData实现图片上传
  8. webMagic解析淘宝cookie 提示Invalid cookie header
  9. SQL Server性能优化(8)堆表结构介绍
  10. corefx 源码追踪:找到引起 SqlDataReader.ReadAsync 执行延迟的那行代码
  11. shell脚本登录数据库
  12. css特殊样式
  13. SSE图像算法优化系列二十六:和时间赛跑之优化高斯金字塔建立的计算过程。
  14. Github Upload Large File 上传超大文件
  15. Codeforces 903G Yet Another Maxflow Problem - 线段树
  16. JavaScript判断当前手机是Android还是iOS系统
  17. Ubuntu下安装软件提示无法锁定管理目录(/var/lib/dpkg/)的解决办法
  18. 060——VUE中vue-router之路由嵌套在文章系统中的使用方法:
  19. 微信小程序头部栏实现
  20. 配置 host only 后 nat不能上网了

热门文章

  1. Step 0: 安装及启动
  2. BZOJ 1651 [Usaco2006 Feb]Stall Reservations 专用牛棚:优先队列【线段最大重叠层数】
  3. 存储过程IF --ELSE IF -- END IF 使用
  4. druid相关的时间序列数据库——也用到了倒排相关的优化技术
  5. Listen81
  6. hdu-5862 Counting Intersections(线段树+扫描线)
  7. codeforces 569B B. Inventory(水题)
  8. BZOJ1067&amp;P2471 [SCOI2007]降雨量[线段树裸题+细节注意]
  9. Digging-贪心
  10. SpringMVC之二:配置 Spring MVC