我正在尝试习惯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
答案 0 :(得分:2)
最有可能的是,这与编译器无关。我的猜测是,这是因为源文件中的错误。你还记得import the appropriate classes and interfaces吗?
您的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);
}
}
忘记导入适当的类通常会导致&#34;无法找到符号&#34;错误消息。