精华内容
下载资源
问答
  • mips compiler java

    2008-10-09 12:43:25
    mips compiler java src by Steven Nie
  • java编译器gjc源码 Java编译器源码 java编译环境 -GJC source java compiler java compiling environment java compiler code java compiler Source
  • JavaCompiler

    千次阅读 2016-06-13 15:17:52
    一、使用JavaCompiler接口来编译Java源程式  使用Java API来编译Java源程式有非常多方法,目前让我们来看一种最简单的方法,通过JavaCompiler进行编译。  我们能通过ToolProvider类的静态方法...

    一、使用JavaCompiler接口来编译Java源程式
      使用Java API来编译Java源程式有非常多方法,目前让我们来看一种最简单的方法,通过JavaCompiler进行编译。
      我们能通过ToolProvider类的静态方法getSystemJavaCompiler来得到一个JavaCompiler接口的实例。
      JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
      JavaCompiler中最核心的方法是run。通过这个方法能编译java源程式。这个方法有3个固定参数和1个可变参数(可变参数是从Jave SE5开始提供的一个新的参数类型,用type… argu表示)。前3个参数分别用来为java编译器提供参数、得到Java编译器的输出信息及接收编译器的错误信息,后面的可变参数能传入一个或多个Java源程式文件。如果run编译成功,返回0。
      int run(InputStream in, OutputStream out, OutputStream err, String… arguments)
      如果前3个参数传入的是null,那么run方法将以标准的输入、输出代替,即System.in、System.out和System.err。如果我们要编译一个test.java文件,并将使用标准输入输出,run的使用方法如下:
      int results = tool.run(null, null, null, “test.java”);
      下面是使用JavaCompiler的完整代码:

    import java.io.*;
    import javax.tools.*;
    public class test_compilerapi
    {
     public static void main(String args[]) throws IOException
     {
      JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
      int results = compiler.run(null, null, null, "test.java");
      System.out.println((results == 0)?"编译成功":"编译失败");
      // 在程式中运行test
      Runtime run = Runtime.getRuntime();
      Process p = run.exec("java test");
      BufferedInputStream in = new BufferedInputStream(p.getInputStream());
      BufferedReader br = new BufferedReader(new InputStreamReader(in));
      String s;
      while ((s = br.readLine()) != null)
       System.out.println(s);
     }
    } 
    public class test
    {
     public static void main(String[] args) throws Exception
     
    }

     编译成功的输出结果:
      编译成功
      JavaCompiler测试成功
      编译失败的输出结果:
    test.java:9: 未找到符号
    符号: 方法 printlnln(java.lang.String)
    位置: 类 java.io.PrintStream
    System.out.printlnln(“JavaCompiler测试成功!”);
    ^
    1 错误
    编译失败
      二、使用StandardJavaFileManager编译Java源程式
      在第一部分我们讨论调用java编译器的最容易的方法。这种方法能非常好地工作,但他确不能更有效地得到我们所需要的信息,如标准的输入、输出信息。而在Java SE6中最佳的方法是使用StandardJavaFileManager类。这个类能非常好地控制输入、输出,并且能通过DiagnosticListener得到诊断信息,而DiagnosticCollector类就是listener的实现。
      使用StandardJavaFileManager需要两步。首先建立一个DiagnosticCollector实例及通过JavaCompiler的getStandardFileManager()方法得到一个StandardFileManager对象。最后通过CompilationTask中的call方法编译源程式。
      在使用这种方法调用Java编译时最复杂的方法就是getTask,下面让我们讨论一下getTask方法。这个方法有如下所示的6个参数。

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

      这些参数大多数都可为null。他们的含义所下。
    o  ?out::用于输出错误的流,默认是System.err。
    o  ?fileManager::标准的文件管理。
    o  ?diagnosticListener: 编译器的默认行为。
    o  ?options: 编译器的选项
    o  ?classes:参和编译的class。
      最后一个参数compilationUnits不能为null,因为这个对象保存了你想编译的Java文件。
    在使用完getTask后,需要通过StandardJavaFileManager的getJavaFileObjectsFromFiles或getJavaFileObjectsFromStrings方法得到compilationUnits对象。调用这两个方法的方式如下:.

    Iterable<? extends JavaFileObject> getJavaFileObjectsFromFiles(
    Iterable<? extends File> files)
    Iterable<? extends JavaFileObject> getJavaFileObjectsFromStrings(
    Iterable<String> names)
    String[] filenames = …;
    Iterable<? extends JavaFileObject> compilationUnits =
    fileManager.getJavaFileObjectsFromFiles(Arrays.asList(filenames));
    JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager,
    diagnostics, options, null, compilationUnits);

      最后需要关闭fileManager.close();
      下面是个完整的演示程式。

    import java.io.*;
    import java.util.*;
    import javax.tools.*;
    public class test_compilerapi
    {
     private static void compilejava() throws Exception
     {
      JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
      // 建立DiagnosticCollector对象 
      DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>(); 
      StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null);
      // 建立用于保存被编译文件名的对象
      // 每个文件被保存在一个从JavaFileObject继承的类中 
      Iterable<? extends JavaFileObject> compilationUnits = fileManager
    .getJavaFileObjectsFromStrings(Arrays asList("test3.java"));
      JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager,
    diagnostics, null, null, compilationUnits);
      // 编译源程式
      boolean success = task.call();
      fileManager.close();
      System.out.println((success)?"编译成功":"编译失败");
     }
     public static void main(String args[]) throws Exception
     
    }

    如果想得到具体的编译错误,能对Diagnostics进行扫描,代码如下:

    for (Diagnostic diagnostic : diagnostics.getDiagnostics())
    System.out.printf(
    "Code: %s%n" +
    "Kind: %s%n" +
    "Position: %s%n" +
    "Start Position: %s%n" +
    "End Position: %s%n" +
    "Source: %s%n" +
    "Message: %s%n",
    diagnostic.getCode(), diagnostic.getKind(),
    diagnostic.getPosition(), diagnostic.getStartPosition(),
    diagnostic.getEndPosition(), diagnostic.getSource(),
    diagnostic.getMessage(null));
      被编译的test.java代码如下:
    public class test
    {
     public static void main(String[] args) throws Exception
     {
      aa; //错误语句
      System.out.println("JavaCompiler测试成功!");
     }
    }

      在这段代码中多写了个aa,得到的编译错误为:

    Code: compiler.err.not.stmt
    Kind: ERROR
    Position: 89
    Start Position: 89
    End Position: 89
    Source: test.java
    Message: test.java:5: 不是语句
    Success: false

      通过JavaCompiler进行编译都是在当前目录下生成.class文件,而使用编译选项能改动这个默认目录。编译选项是个元素为String类型的Iterable集合。如我们能使用如下代码在D盘根目录下生成.class文件。

    Iterable<String> options = Arrays.asList("-d", "d:");
    JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager,
    diagnostics, options, null, compilationUnits); 

      在上面的例子中options处的参数为null,而要传递编译器的参数,就需要将options传入。
      有时我们编译一个Java源程式文件,而这个源程式文件需要另几个Java文件,而这些Java文件又在另外一个目录,那么这就需要为编译器指定这些文件所在的目录。
    Iterable options = Arrays.asList(“-sourcepath”, “d:src”);
      上面的代码指定的被编译Java文件所依赖的源文件所在的目录。

    展开全文
  • 首先我们来认识一下 java中的一个对象 JavaCompiler JavaCompiler : 不知道肯定很陌生,其实这个api出来很久了,他是jdk6的特性,用来编译java的源程式的,详细介绍可以参考百度或google一下,介绍都很详细 Java的反射 ...

    .首先我们来认识一下 java中的一个对象 JavaCompiler

    JavaCompiler : 不知道肯定很陌生,其实这个api出来很久了,他是jdk6的特性,用来编译java的源程式的,详细介绍可以参考百度或google一下,介绍都很详细

    Java的反射 : 这个我不多做介绍了,程序中很常见,基本上java程序员都会接触到,列入金典的框架 spring 等等
     

     /**
         * 装载字符串成为java可执行文件
         * @param className className
         * @param javaCodes javaCodes
         * @return Class
         */
        private  Class<?> compile(String className, String javaCodes) {
            JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
            StandardJavaFileManager fileManager = compiler.getStandardFileManager(null,                 null, null);
            StrSrcJavaObject srcObject = new StrSrcJavaObject(className, javaCodes);
            Iterable<? extends JavaFileObject> fileObjects = Arrays.asList(srcObject);
            String flag = "-d";
            String outDir = "";
            try {
                File classPath = new File(Thread.currentThread().getContextClassLoader().getResource("").toURI());
                outDir = classPath.getAbsolutePath() + File.separator;
            } catch (URISyntaxException e1) {
                e1.printStackTrace();
            }
            Iterable<String> options = Arrays.asList(flag, outDir);
            JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, null, options, null, fileObjects);
            boolean result = task.call();
            if (result == true) {
                try {
                    return Class.forName(className);
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
            }
            return null;
        }
    

    上面的代码也是较为核心的部分 ,就是将我们的字符串转换成一个java类,然后编译成class 重点看call(),

    call(): 此方法就是进行动态编译可执行的代码

    编译完成后,会返回boolean  为true表示编译成功,反之则, 或者 error : java.lang.illegalstateexception' ....... 出现异常情况时,不要慌张,可能这时脑回路不正确,参考我的代码,比较一下自己的出处.

    接下来我们得到编译完成的class , 成功后class已经加载到内存中了,我们这是只需要通过java的反射去找到该类文件并执行它就好了
     

     private Object run(String method,String codes){
     
            String className = "com.test.Eval";
            StringBuilder sb = new StringBuilder();
            sb.append("package com.test;");
            sb.append("\n public class Eval{\n ");
            sb.append(codes);
            sb.append("\n}");
     
            Class<?> clazz = compile(className, sb.toString());
            try {
                // 生成对象
                Object obj = clazz.newInstance();
                Class<? extends Object> cls = obj.getClass();
                // 调用main方法
                Method m = clazz.getMethod(method,String[].class);
                Object invoke = m.invoke(obj, new Object[] { new String[] {} });
                return invoke;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
     
        }
    

    好了,代码完成,我们看一下执行结果

      public static Object eval() {
            Eval eval = mWeakReference.get();
            String method = "main";
            String codes = "public static void main(String[]args){" +
                    "System.out.print(\"hello world\"); }";
            eval.run(method,codes);
            return null;
        }
     
     
        public static void main(String[] args) {
            eval();
        }
    

     

    Java eval  demo 地址 : https://github.com/SunnyLive/JavaEval.git

    展开全文
  • **** JavaCompiler欢迎使用JavaCompiler ! 此java编译器将java文件编译为dex文件。 将Java文件/ jar文件转换为dex 语言支持:中文,英文。 支持lib文件(修复bug)
  • 一、使用JavaCompiler接口来编译Java源程式 使用Java API来编译Java源程式有非常多方法,目前让我们来看一种最简单的方法,通过JavaCompiler进行编译。 我们能通过ToolProvider类的静态方法getSystemJavaCompiler...

    一、使用JavaCompiler接口来编译Java源程式 
      使用Java API来编译Java源程式有非常多方法,目前让我们来看一种最简单的方法,通过JavaCompiler进行编译。 
      我们能通过ToolProvider类的静态方法getSystemJavaCompiler来得到一个JavaCompiler接口的实例。 
      JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 
      JavaCompiler中最核心的方法是run。通过这个方法能编译java源程式。这个方法有3个固定参数和1个可变参数(可变参数是从Jave SE5开始提供的一个新的参数类型,用type… argu表示)。前3个参数分别用来为java编译器提供参数、得到Java编译器的输出信息及接收编译器的错误信息,后面的可变参数能传入一个或多个Java源程式文件。如果run编译成功,返回0。 
      int run(InputStream in, OutputStream out, OutputStream err, String… arguments) 
      如果前3个参数传入的是null,那么run方法将以标准的输入、输出代替,即System.in、System.out和System.err。如果我们要编译一个test.java文件,并将使用标准输入输出,run的使用方法如下: 
      int results = tool.run(null, null, null, “test.java”); 
      下面是使用JavaCompiler的完整代码:

    import java.io.*;
    import javax.tools.*;
    public class test_compilerapi
    {
     public static void main(String args[]) throws IOException
     {
      JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
      int results = compiler.run(null, null, null, "test.java");
      System.out.println((results == 0)?"编译成功":"编译失败");
      // 在程式中运行test
      Runtime run = Runtime.getRuntime();
      Process p = run.exec("java test");
      BufferedInputStream in = new BufferedInputStream(p.getInputStream());
      BufferedReader br = new BufferedReader(new InputStreamReader(in));
      String s;
      while ((s = br.readLine()) != null)
       System.out.println(s);
     }
    } 
    public class test
    {
     public static void main(String[] args) throws Exception
     
    }

     编译成功的输出结果: 
      编译成功 
      JavaCompiler测试成功 
      编译失败的输出结果: 
    test.java:9: 未找到符号 
    符号: 方法 printlnln(java.lang.String) 
    位置: 类 java.io.PrintStream 
    System.out.printlnln(“JavaCompiler测试成功!”); 

    1 错误 
    编译失败 
      二、使用StandardJavaFileManager编译Java源程式 
      在第一部分我们讨论调用java编译器的最容易的方法。这种方法能非常好地工作,但他确不能更有效地得到我们所需要的信息,如标准的输入、输出信息。而在Java SE6中最佳的方法是使用StandardJavaFileManager类。这个类能非常好地控制输入、输出,并且能通过DiagnosticListener得到诊断信息,而DiagnosticCollector类就是listener的实现。 
      使用StandardJavaFileManager需要两步。首先建立一个DiagnosticCollector实例及通过JavaCompiler的getStandardFileManager()方法得到一个StandardFileManager对象。最后通过CompilationTask中的call方法编译源程式。 
      在使用这种方法调用Java编译时最复杂的方法就是getTask,下面让我们讨论一下getTask方法。这个方法有如下所示的6个参数。

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

      这些参数大多数都可为null。他们的含义所下。 
    o  ?out::用于输出错误的流,默认是System.err。 
    o  ?fileManager::标准的文件管理。 
    o  ?diagnosticListener: 编译器的默认行为。 
    o  ?options: 编译器的选项 
    o  ?classes:参和编译的class。 
      最后一个参数compilationUnits不能为null,因为这个对象保存了你想编译的Java文件。 
    在使用完getTask后,需要通过StandardJavaFileManager的getJavaFileObjectsFromFiles或getJavaFileObjectsFromStrings方法得到compilationUnits对象。调用这两个方法的方式如下:.

    Iterable<? extends JavaFileObject> getJavaFileObjectsFromFiles(
    Iterable<? extends File> files)
    Iterable<? extends JavaFileObject> getJavaFileObjectsFromStrings(
    Iterable<String> names)
    String[] filenames = …;
    Iterable<? extends JavaFileObject> compilationUnits =
    fileManager.getJavaFileObjectsFromFiles(Arrays.asList(filenames));
    JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager,
    diagnostics, options, null, compilationUnits)
    

        最后需要关闭fileManager.close();  

     下面是个完整的演示程式。

    import java.io.*;
    import java.util.*;
    import javax.tools.*;
    public class test_compilerapi
    {
     private static void compilejava() throws Exception
     {
      JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
      // 建立DiagnosticCollector对象 
      DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>(); 
      StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null);
      // 建立用于保存被编译文件名的对象
      // 每个文件被保存在一个从JavaFileObject继承的类中 
      Iterable<? extends JavaFileObject> compilationUnits = fileManager
    .getJavaFileObjectsFromStrings(Arrays asList("test3.java"));
      JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager,
    diagnostics, null, null, compilationUnits);
      // 编译源程式
      boolean success = task.call();
      fileManager.close();
      System.out.println((success)?"编译成功":"编译失败");
     }
     public static void main(String args[]) throws Exception
     
    }

    如果想得到具体的编译错误,能对Diagnostics进行扫描,代码如下:

    for (Diagnostic diagnostic : diagnostics.getDiagnostics())
    System.out.printf(
    "Code: %s%n" +
    "Kind: %s%n" +
    "Position: %s%n" +
    "Start Position: %s%n" +
    "End Position: %s%n" +
    "Source: %s%n" +
    "Message: %s%n",
    diagnostic.getCode(), diagnostic.getKind(),
    diagnostic.getPosition(), diagnostic.getStartPosition(),
    diagnostic.getEndPosition(), diagnostic.getSource(),
    diagnostic.getMessage(null));
      被编译的test.java代码如下:
    public class test
    {
     public static void main(String[] args) throws Exception
     {
      aa; //错误语句
      System.out.println("JavaCompiler测试成功!");
     }
    }

      在这段代码中多写了个aa,得到的编译错误为:

    Code: compiler.err.not.stmt
    Kind: ERROR
    Position: 89
    Start Position: 89
    End Position: 89
    Source: test.java
    Message: test.java:5: 不是语句
    Success: false

      通过JavaCompiler进行编译都是在当前目录下生成.class文件,而使用编译选项能改动这个默认目录。编译选项是个元素为String类型的Iterable集合。如我们能使用如下代码在D盘根目录下生成.class文件。

    Iterable<String> options = Arrays.asList("-d", "d:");
    JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager,
    diagnostics, options, null, compilationUnits); 

      在上面的例子中options处的参数为null,而要传递编译器的参数,就需要将options传入。 
      有时我们编译一个Java源程式文件,而这个源程式文件需要另几个Java文件,而这些Java文件又在另外一个目录,那么这就需要为编译器指定这些文件所在的目录。 
    Iterable options = Arrays.asList(“-sourcepath”, “d:src”); 
      上面的代码指定的被编译Java文件所依赖的源文件所在的目录。

    展开全文
  • Java-Compiler:Java编译器源码阅读
  • 使用JavaCompiler 编译 Java 类文件

    千次阅读 2019-05-31 20:49:35
    从1.6版本的JDK开始,JDK提供了标准的包... JDK提供的调用接口是JavaCompiler类,该类及CompilerAPI相关类在JDK的tools.jar包中。 注意:在开发过程中由于使用的开发工具(IntelliJ IDEA或Eclipse)默认加载jd...
          从1.6版本的JDK开始,JDK提供了标准的包(javax.tools)可以方便的调用JVM的编译器,可以方便的通过JVM的编译器来编译java源文件。
       JDK提供的调用接口是JavaCompiler类,该类及CompilerAPI相关类在JDK的tools.jar包中。
       
       注意:在开发过程中由于使用的开发工具(IntelliJ IDEA或Eclipse)默认加载jdk包中的jre下的lib中的jar,请检查是否将lib下的tool.jar引入,
            如果没有引用将导致ClassNotFoundException异常
    

    编译java文件demo

     /**
         * 编译java文件,使用StandardJavaFileManager编译Java源程式
         * @param encoding 编译编码
         * @param filePath 文件或者目录(若为目录,自动递归编译)
         * @param diagnostics 存放编译过程中的错误信息
         * @return
         * @throws Exception
         */
        public boolean compiler(String encoding, String filePath,String outputFile, DiagnosticCollector<JavaFileObject> diagnostics)  throws Exception{
    
            String sourceDir=filePath;//java源文件存放目录
            String targetDir="";//编译后class类文件存放目录
    
            // 获取编译器实例
            JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
            // 获取标准文件管理器实例
            StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, Charset.forName(encoding));
            try {
                //得到编译关联的jar
                List<File> jars = new ArrayList<File>();
                getJarFiles(new File(filePath),jars);
                // 得到filePath目录下的所有java源文件
                File sourceFile = new File(sourceDir);
                List<File> sourceFileList = new ArrayList<File>();
                getSourceFiles(sourceFile, sourceFileList);
                // 没有java文件,直接返回
                if (sourceFileList.size() == 0) {
                    System.out.println(sourceDir + "目录下查找不到任何java文件");
                    return false;
                }
                //加载依赖的jar文件和依赖的class文件
                List<File> dependencies = new ArrayList<File>();
                dependencies.addAll(jars);
                //dependencies.addAll(sourceFileList);
                fileManager.setLocation(StandardLocation.CLASS_PATH,dependencies);
                fileManager.setLocation(StandardLocation.SOURCE_PATH,sourceFileList);
                //编译后输出的地址
                fileManager.setLocation(StandardLocation.CLASS_OUTPUT,Arrays.asList(new File[]{new File(outputFile)}));
    
                // 获取要编译的编译单元
                Iterable<? extends JavaFileObject> compilationUnits = fileManager.getJavaFileObjectsFromFiles(sourceFileList);
                /**
                 * 编译选项,在编译java文件时,编译程序会自动的去寻找java文件引用的其他的java源文件或者class。
                 * -sourcepath选项就是定义java源文件的查找目录,有时我们编译一个Java源程式文件,而这个源程式文件需要另几个Java文件,
                 *            而这些Java文件又在另外一个目录,那么这就需要为编译器指定这些文件所在的目录。
                 * -classpath选项就是定义class文件的查找目录。
                 * -d 是用来指定存放编译生成的.class文件的路径
                 */
                //Iterable<String> options = Arrays.asList("-encoding", encoding, "-classpath", jars.toString(), "-d", targetDir, "-sourcepath", sourceDir);
                Iterable<String> options = Arrays.asList("-encoding", encoding,"-source","1.8");
                JavaCompiler.CompilationTask compilationTask = compiler.getTask(null, fileManager, diagnostics, options, null, compilationUnits);
                //运行编译任务
                return compilationTask.call();
            }finally {
                fileManager.close();
            }
        }
    

    查找该目录下的所有的java文件

        private void getSourceFiles(File sourceFile, List<File> sourceFileList) throws Exception {
            if (sourceFile.exists() && sourceFileList != null) {//文件或者目录必须存在
                if (sourceFile.isDirectory()) {// 若file对象为目录
                    File[] childrenFiles=sourceFile.listFiles((pathname->{
                        if (pathname.isDirectory()) {
                            return true;
                        }else{
                            String name = pathname.getName();
                            if (name.endsWith(".java") ? true : false) {
                                return true;
                            }
                            return false;
                        }
                    }));
                    // 递归调用
                    for (File childFile : childrenFiles) {
                        getSourceFiles(childFile, sourceFileList);
                    }
                }else{
                    //若file对象为文件
                    String name = sourceFile.getName();
                    if (name.endsWith(".java") ? true : false) {
                        //System.out.println(sourceFile.getAbsolutePath());
                        sourceFileList.add(sourceFile);
                    }
                }
            }
        }
    

    递归查找该目录下的所有的jar文件

    private void getJarFiles(File jarFile,List<File> jars) throws Exception {
            if (jarFile.exists() && jarFile != null) {//文件或者目录必须存在
                if (jarFile.isDirectory()) {// 若file对象为目录
                    File[] childrenFiles= jarFile.listFiles((pathname) -> {
                            if (pathname.isDirectory()) {
                                return true;
                            } else {
                                String name = pathname.getName();
                                if (name.endsWith(".jar") ? true : false) {
                                    return true;
                                }
                                return false;
                            }
                        });
                    // 递归调用
                    for (File childFile : childrenFiles) {
                        getJarFiles(childFile, jars);
                    }
                }else{
                    String name = jarFile.getName();
                    if (name.endsWith(".jar") ? true : false) {
                       // System.out.println(jarFile.getAbsolutePath());
                        jars.add(jarFile);
                    }
                }
            }
        }
    

    调用

    public static void main(String[] objs){
       DynamicCompilerTool tool = new DynamicCompilerTool();
       String outputFile = target.getAbsolutePath()+File.separator+"WebContent"+File.separator+"WEB-INF"+File.separator+"classes";
       File cls=new File(outputFile);
       if(!cls.exists()){
            cls.mkdir();
        }
        String encoding = "utf-8";
        boolean b = tool.compiler(encoding, javaProject.getAbsolutePath(), outputFile, diagnostics);
         if(!b){
    	    StringJoiner rs=new StringJoiner(System.getProperty("line.separator"));
    	       for (Diagnostic diagnostic : diagnostics.getDiagnostics()) {
    	           rs.add(String.format("%s:%s[line %d column %d]-->%s%n", diagnostic.getKind(), diagnostic.getSource(), diagnostic.getLineNumber(),
    	                   diagnostic.getColumnNumber(),
    	                   diagnostic.getMessage(null)));
    	      System.out.println("编译失败,原因:"+rs.toString());
    	}else{
    	   System.out.println("编译成功");
        }
    }
    
    展开全文
  • GNU Compiler for Java

    2012-06-18 12:36:35
    GNU Compiler for Java From Wikipedia, the free encyclopedia GNU Compiler for Java Developer(s) The GNU Project Operating system Unix-like Type Compiler Lic
  • Java反编译工具,javacompiler
  • IntelliJ IDEA 编译错误,提示 Compilation failed: internal java compiler error或java compiler failed
  • 该编译器不完整:仅包含词法分析器和解析器。 Java语法规范减少了。
  • drools-compiler module jci package ...org.drools.compiler.commons.jci.compilers.EclipseJavaCompiler:Eclipse Java development tools (JDT) 's ECJ(Eclipse Compiler for Java); org.drools.compile...
  • Error:java: Compilation failed: internal java compiler error 错误原因 导致这个错误的原因主要是因为jdk版本问题,此处有两个原因,一个是编译版本不匹配,一个是当前项目jdk版本不支持。 查看项目的jdk...
  • compiler in java(英文)

    2017-12-15 16:08:48
    使用java语言来编写compiler,更加易于理解,并且在书中有大量的实例内容,可以帮助你快速入门,对于加深对于编程语言的理解至关重要。从书中我想每一个读者都可以获得自己想要得到的内容,本书深入浅出,适合大家...
  • IDEA报错: java: Compilation failed: internal java compiler error 今天要Build公司那边给的项目框架时,Build失败,报的错误是:java: Compilation failed: internal java compiler error,具体如下图所示: ...
  •  at org.apache.cxf.common.util.Compiler.useJava6Compiler(Compiler.java:189)  at org.apache.cxf.common.util.Compiler.compileFiles(Compiler.java:143)  at org.apache.cxf.common.util.Compiler....
  • 问题描述: 新建了maven项目,写了一个测试类,main方法运行报错`Error:java: Compilation failed: internal java compiler error` 已尝试的解决办法:在project和module中将JDK版本改成了1.8 且在setting中将...
  • java compiler没有1.8

    2017-09-15 02:24:05
    java compiler没有1.8 怎么解决呢,项目每次都打错,感觉很不舒服,我现在用的是jdk1.8,但是project facts 最大只能选择1.7。 哪位大侠知道怎么修改的 ????
  • C0Compiler in java

    2009-06-20 10:46:36
    java编写的C0Compiler 完好的注释 中间代码:四元式 目标代码:32位汇编
  • 编译器 JAVA语言编译器
  • eclipse javaComPiler

    2017-11-24 00:02:29
    当eclipse 启动tomcate提示 java编译的包兼容性问题Unsupported Major.Minor Version 51.0 需要在 javaComPiler修改运行时jdk版本 并修改eclipsel jdk版本

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 167,457
精华内容 66,982
关键字:

compilerjava

java 订阅