2015-11-06 49 views
0

這是我的代碼編譯的一些Java sourcefiles:的javax systemcompiler不產生類文件

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 
    dependencies = getJarFiles(this.libPath); 
    StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null); 

    ArrayList<File> sourceFiles = getSourceFiles(this.apiGeneratedSrcPath); 
    Iterable<? extends JavaFileObject> compilationUnits1 = fileManager.getJavaFileObjectsFromFiles(sourceFiles); 
    try { 
     fileManager.setLocation(StandardLocation.CLASS_OUTPUT, Arrays.asList(new File(this.genClassDir))); 
     fileManager.setLocation(StandardLocation.CLASS_PATH, dependencies); 
     if(!compiler.getTask(null, fileManager, null, null, null, compilationUnits1).call()) 
      throw new IllegalStateException("Error on compiling API"); 
     fileManager.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

,我也試過這個版本:

optionList.addAll(Arrays.asList("-Xmaxerrs", "20")); 
    optionList.addAll(Arrays.asList("-d", "target\\classes")); 
    optionList.addAll(Arrays.asList("-cp", classpath)); 


    //Java files 
    System.out.println("Get source files"); 
    ArrayList<File> sourcefiles = getSourceFiles(this.apiGeneratedSrcPath); 
    Iterable<? extends JavaFileObject> compilationUnits1 = fileManager.getJavaFileObjectsFromFiles(sourcefiles); 
    JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, null, optionList, null, compilationUnits1); 

    System.out.println("Compile API"); 
    boolean compiled = task.call(); 
    if(!compiled) 
     throw new IllegalStateException("Error on compiling API"); 
    System.out.println("Compile API Done"); 

但在我genClassDir(這應該是輸出爲我的類文件)沒有生成類文件,但我沒有得到編譯器錯誤。

我也越來越htis警告我解決不了,但它應該打破構建過程:

Access restriction: The method 'StandardJavaFileManager.setLocation(JavaFileManager.Location, Iterable<? extends File>)' is not API (restriction on required library 'C:\Program Files\Java\jdk1.7.0_80\jre\lib\rt.jar') 

編譯器爲什麼不從我的.java源geenerate .class文件的任何想法?

+0

我試過你的第一個版本,它工作正常..它創建類..我嘗試了一個非常簡單的類沒有代碼.. – awsome

+0

好吧,我檢查了所有源文件存在,但仍然沒有生成類文件...我真的無能爲力發生了什麼 – Gobliins

回答

0

我不應該寫這個答案,但在評論中,我無法正確格式化代碼。下面是我做的,它的工作

package hello; 

import java.io.File; 
import java.io.IOException; 
import java.util.Arrays; 
import java.util.List; 

import javax.tools.JavaCompiler; 
import javax.tools.JavaFileObject; 
import javax.tools.StandardJavaFileManager; 
import javax.tools.StandardLocation; 
import javax.tools.ToolProvider; 

public class Snippet { 

    public static void main(String[] args) { 
     JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 
     StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null); 
     List<File> sourceFiles = Arrays.asList(new File("C://project//src//hello//Hello.java")); 
     Iterable<? extends JavaFileObject> compilationUnits1 = fileManager.getJavaFileObjectsFromFiles(sourceFiles); 
     try { 
      fileManager.setLocation(StandardLocation.CLASS_OUTPUT, Arrays.asList(new File("C://project//classes//"))); 
      if(!compiler.getTask(null, fileManager, null, null, null, compilationUnits1).call()) 
       throw new IllegalStateException("Error on compiling API"); 
      fileManager.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

} 

而且Hello.java

package hello; 

public class Hello { 

} 

和輸出是一個類文件:C://project//classes//hello//Hello.class

+0

你有沒有得到這個警告在底部?你還使用哪個jdk? – Gobliins

+0

不,我沒有得到任何警告..我使用jdk1.7.0_51 – awsome

+0

嗨,我交換到Java 8,現在它的工作再次......奇怪,它沒有與JDK 1.7_0_80工作 – Gobliins