Java程序动态编译Java源文件

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

先贴出官网推荐写法:

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();

}

原文地址:https://www.cnblogs.com/xxjcai/p/10881371.html

时间: 2024-10-29 19:10:57

Java程序动态编译Java源文件的相关文章

java程序的编译与运行------------------学习笔记(一)

  这里非常粗略的写一下大致过程(如有错误的地方,请及时联系博主^_^) 1.java程序的编译 ①编译器将源文件(*.java)编译成字节码文件( *.class). java编译器会根据classpath路径找到对应的java文件(不存在,则报错),如果该类不依赖其他类,则直接将该类编译成.class文件,如若依赖其他类, 依赖的类已编译,则直接引用,否则先编译被依赖的类,再编译本类. 编译后的字节码文件主要包括字节:常量池和方法字节码; 常量池:存放 代码出现过的所有token(包名,类名

Java程序的编译与运行

Java程序的编译 首先写好一个java程序后需要运行(文件保存名为以.java结尾的文件称之为源文件,源文件里面所编写的代码叫做源代码) 这个.java结尾的文件是不能直接运行的,需要使用javac.exe命令编译成以.class结尾的文件 Java编译器将我们编写的java源文件加载,然后去检查源码里面的语法,如果出现了语法错误会进行提示,这个阶段提示的错误我们称之为编译错误.如果遇到了编译错误,是不会生成.class文件的, 遇到编译错误时,需要我们根据错误提示的信息去分析和解决. 在cm

JAVA之动态编译

通过Java动态生成class文件 今天说下JAVA中的动态编译,这个功能根据我现在的了解好像没有见到过用的,我Jio的吧,现在的一些在线代码编缉器可以用到了,这个具体我也不是很清楚.感兴趣的大家可以自已了解下. 说到动态编缉大家可能会想到,动态编缉肯定不是像我们平时运行程序似的在本地的平台就开始编译了. 动态编译其实是在程序的运行过程中对Java文件的编译或者是运行.class的文件.比如说我今天想装一波,我写个java的程序,又写了个另一个java的程序在小伙伴面秀,我只运行一个java程序

DOS环境下含包并引用第三方jar的java程序的编译及运行

DOS环境下含包并引用第三方jar的java程序的编译及运行 1.程序目录机构 bin:class文件生成目录 lib:第三方jar包目录 src:源程序文件目录 2.程序代码: 3.程序编译 javac –classpath .;..\lib\commons-lang-2.3.jar -d ..\bin com\Test.java 4.编译后的程序目录: 5.运行程序及结果显示 java -classpath .;..\lib\commons-lang-2.3.jar com.Test

java内存动态编译执行

1.package org.jui.core.dynamic; public class DynaCompTest { public static void main(String[] args) throws Exception { String fullName = "DynaClass"; StringBuilder src = new StringBuilder(); src.append("public class DynaClass {\n"); src

[java基础学习笔记]Java8SE开发环境搭建、第一个Java Hello World、Java程序的编译与执行

本文作者:sushengmiyan 本文地址:http://blog.csdn.net/sushengmiyan/article/details/25745945 主要内容: ---------------------------------------------------| 1.JDK的下载与安装                            | 2.编写第一个java程序HelloWorld     | 3.编译执行HelloWorld                      

java的动态编译功能

import javax.tools.JavaCompiler; import javax.tools.ToolProvider; /** * java的动态编译 * @author Administrator * */ public class Demo04 { public static void main(String[] args) { JavaCompiler compiler=ToolProvider.getSystemJavaCompiler(); int result = com

越来越多的Java程序员转行Java大数据...

JAVA的精密,强大,拥有其它语言不可替代的性能和可维护性,早已经是成为最受欢迎的编程语言之一,很多人想进入IT行业,首选的第一门语言就是JAVA. 但是,在未来肯定是大数据的天下,人工智能的爆发,将会有大量企业会进入大数据领域,从而产生大量的大数据人才需求. 据最新发布的<大数据人才报告>显示,目前全国的大数据人才仅46万,未来3-5年内大数据人才的缺口将高达150万.领英报告表明,数据分析人才的供给指数最低,仅为0.05,属于高度稀缺.数据分析人才跳槽速度也最快,平均跳槽速度为19.8个月

3、使用记事本编写java程序并编译

总体步骤: 第一步:新建记事本,文件改名为HelloWorld.java,源文件后缀名为.java 第二步:编译,使用CMD编译javac命令,编译过后生成.class文件,即字节码文件(即输入:javac HelloWorld.java) 第三步:使用解释器,使用CMD编译java命令(即输入:java HelloWorld) /***********************************************************************************