JavaCompiler无法正确编译文件 [英] JavaCompiler not compiling files properly

查看:117
本文介绍了JavaCompiler无法正确编译文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图适应JavaCompiler并尝试使用它来编译程序,我可以成功地编译包含单个文件的程序,但是当我尝试编译具有多个文件的项目时.在编译实现其他类的文件以及该类使用已实现的类中的方法的任何地方时,都会出现错误.

这是我用来编译Java代码的代码

private final String  directoryForBin = "C:/TempBINfolder/bin";

public List doCompilation(String sourceCode, String locationOfFile) {
   List<String> compile = new ArrayList<>();

    SimpleJavaFileObject fileObject = new DynamicJavaSourceCodeObject(locationOfFile, sourceCode);
    JavaFileObject javaFileObjects[] = new JavaFileObject[]{fileObject};

    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

    StandardJavaFileManager stdFileManager = compiler.getStandardFileManager(null, Locale.getDefault(), null);

    Iterable<? extends JavaFileObject> compilationUnits = Arrays.asList(javaFileObjects);

    // creates a Temp BIN foler on the C: drive to add .class files for compiling      
    new File(directoryForBin).mkdirs();

    String[] compileOptions = new String[]{"-d", directoryForBin, "-classpath", System.getProperty("java.class.path")};
    Iterable<String> compilationOptions = Arrays.asList(compileOptions);

    DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();

    CompilationTask compilerTask = compiler.getTask(null, stdFileManager, diagnostics, compilationOptions, null, compilationUnits);

    boolean status = compilerTask.call();

    if (!status) {//If compilation error occurs 
        // Iterate through each compilation problem and print it
        for (Diagnostic diagnostic : diagnostics.getDiagnostics()) { 
            compile.add(diagnostic.getKind().toString()+" on line  "+ diagnostic.getLineNumber() +"\nIn file:  \n"+ diagnostic.toString()+"\n\n");
        }
    }
    try {
        stdFileManager.close();//Close the file manager
    } catch (IOException e) {
        e.printStackTrace();
    }

    return compile;
}

这里是我尝试编译的一个类的示例

    public class IntegerComparator 
             implements Comparator<Integer>
{
   public IntegerComparator(){}

   public int compare(Integer a, Integer b)
   {  int aValue = a.intValue();
      int bValue = b.intValue();
      return (aValue - bValue);
   }

}

有人知道这里出了什么问题吗,为什么我的代码没有找到实现的类,即使它与实现它的类在同一个文件夹中也是如此?

是因为程序包不在程序顶部吗?

这是以上示例的输出错误

ERROR on line  8
In file:  
/projects/Compiler/Studentfilestotest/LAB3/aroc1/a3/IntegerComparator.java:8: error: cannot find symbol
             implements Comparator<Integer>
                        ^
  symbol: class Comparator

这是System.getProperty("java.class.path")返回的内容

C:\projects\Compiler\Compiler\Jar Files\jsyntaxpane-0.9.5-b29.jar;
C:\projects\Compiler\Compiler\Jar Files\jtar-1.1.jar;
C:\projects\Compiler\Compiler\Jar Files\sqlitejdbc-v056.jar;
C:\Program Files\NetBeans 7.1.2\java\modules\ext\beansbinding-1.2.1.jar;
C:\Program Files\NetBeans 7.1.2\java\modules\ext\AbsoluteLayout.jar;
C:\projects\Compiler\Compiler\Jar Files\junit-4.11-SNAPSHOT-20120416-1530.jar;
C:\projects\Compiler\Compiler\Jar Files\commons-io-2.4-bin.zip;
C:\projects\Compiler\Compiler\Jar Files\commons-io-2.4\commons-io-2.4.jar;
C:\projects\Compiler\Compiler\Jar Files\poi-3.8\poi-3.8-20120326.jar;
C:\projects\Compiler\Compiler\Jar Files\javamail-1.4.5\mail.jar;
C:\projects\Compiler\Compiler\build\classes

解决方案

最有可能与编译器无关.我的猜测是这是由于源文件中的错误所致.您还记得导入适当的类和接口吗?

您的IntegerComparator.java文件需要包含导入:

import java.util.Comparator; // <--- Import!

public class IntegerComparator 
      implements Comparator<Integer>{

   public IntegerComparator(){}

   public int compare(Integer a, Integer b){
      int aValue = a.intValue();
      int bValue = b.intValue();
      return (aValue - bValue);
   }
}

忘记导入适当的类通常会导致找不到符号"错误消息.

I am trying to get used to the JavaCompiler and trying to compile programs with it, I can successfully compile programs that comprises of single file but when im trying to compile projects with multiple files. I get errors on compiling files that implement other classes and where ever the class uses a method from the implemented class.

Here is the code that I am using to compile the java code

private final String  directoryForBin = "C:/TempBINfolder/bin";

public List doCompilation(String sourceCode, String locationOfFile) {
   List<String> compile = new ArrayList<>();

    SimpleJavaFileObject fileObject = new DynamicJavaSourceCodeObject(locationOfFile, sourceCode);
    JavaFileObject javaFileObjects[] = new JavaFileObject[]{fileObject};

    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

    StandardJavaFileManager stdFileManager = compiler.getStandardFileManager(null, Locale.getDefault(), null);

    Iterable<? extends JavaFileObject> compilationUnits = Arrays.asList(javaFileObjects);

    // creates a Temp BIN foler on the C: drive to add .class files for compiling      
    new File(directoryForBin).mkdirs();

    String[] compileOptions = new String[]{"-d", directoryForBin, "-classpath", System.getProperty("java.class.path")};
    Iterable<String> compilationOptions = Arrays.asList(compileOptions);

    DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();

    CompilationTask compilerTask = compiler.getTask(null, stdFileManager, diagnostics, compilationOptions, null, compilationUnits);

    boolean status = compilerTask.call();

    if (!status) {//If compilation error occurs 
        // Iterate through each compilation problem and print it
        for (Diagnostic diagnostic : diagnostics.getDiagnostics()) { 
            compile.add(diagnostic.getKind().toString()+" on line  "+ diagnostic.getLineNumber() +"\nIn file:  \n"+ diagnostic.toString()+"\n\n");
        }
    }
    try {
        stdFileManager.close();//Close the file manager
    } catch (IOException e) {
        e.printStackTrace();
    }

    return compile;
}

Here is a sample of one of the classes I am trying to compile

    public class IntegerComparator 
             implements Comparator<Integer>
{
   public IntegerComparator(){}

   public int compare(Integer a, Integer b)
   {  int aValue = a.intValue();
      int bValue = b.intValue();
      return (aValue - bValue);
   }

}

Does anybody know what is going wrong here and why my code is not finding the implemented class even though it is in the same folder as that of the class implementing it?

Is it because the package is not located at the top of the program?

EDIT: This is the output error for the above example

ERROR on line  8
In file:  
/projects/Compiler/Studentfilestotest/LAB3/aroc1/a3/IntegerComparator.java:8: error: cannot find symbol
             implements Comparator<Integer>
                        ^
  symbol: class Comparator

This is what System.getProperty("java.class.path") is returning

C:\projects\Compiler\Compiler\Jar Files\jsyntaxpane-0.9.5-b29.jar;
C:\projects\Compiler\Compiler\Jar Files\jtar-1.1.jar;
C:\projects\Compiler\Compiler\Jar Files\sqlitejdbc-v056.jar;
C:\Program Files\NetBeans 7.1.2\java\modules\ext\beansbinding-1.2.1.jar;
C:\Program Files\NetBeans 7.1.2\java\modules\ext\AbsoluteLayout.jar;
C:\projects\Compiler\Compiler\Jar Files\junit-4.11-SNAPSHOT-20120416-1530.jar;
C:\projects\Compiler\Compiler\Jar Files\commons-io-2.4-bin.zip;
C:\projects\Compiler\Compiler\Jar Files\commons-io-2.4\commons-io-2.4.jar;
C:\projects\Compiler\Compiler\Jar Files\poi-3.8\poi-3.8-20120326.jar;
C:\projects\Compiler\Compiler\Jar Files\javamail-1.4.5\mail.jar;
C:\projects\Compiler\Compiler\build\classes

解决方案

Most likely, this has nothing to do with the compiler. My guess is that this is because of an error in the source file. Did you remember to import the appropriate classes and interfaces?

Your IntegerComparator.java file needs to contain the import:

import java.util.Comparator; // <--- Import!

public class IntegerComparator 
      implements Comparator<Integer>{

   public IntegerComparator(){}

   public int compare(Integer a, Integer b){
      int aValue = a.intValue();
      int bValue = b.intValue();
      return (aValue - bValue);
   }
}

Forgetting to import appropriate classes often results in the "cannot find symbol" error messages.

这篇关于JavaCompiler无法正确编译文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆