Ich arbeite an einer Tomcat WebApp für meine Universität, die Studenten ihre Java-Codes kompilieren und die Spur sehen können. Ich installiere es auf einer RHEL7 VM. Aber wenn ich die Kompilation Funktion zu testen (dieses wird von mir nicht implementiert), die Methode, die ich bin Bereitstellung gibt diese:Java Compiler sagt immer "Fehler beim Schreiben className: className.class (Berechtigung verweigert)"
error while writing className: className.class (Permission denied)
Error on line 1 in className.java
Ich zeige Ihnen die Methode, die ich denke, generiert dies:
public String compileJavaCode(String javaCode, String javaFileName, File workingDir) throws IOException, TimeoutException{
javax.tools.JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null);
this.createJavaFile(javaCode, javaFileName, workingDir);
JavaFileObject file = new JavaSourceFromString(javaFileName, javaCode);
Iterable<? extends JavaFileObject> compilationUnits = Arrays.asList(file);
compiler.getTask(null, fileManager, diagnostics, null, null, compilationUnits).call();
String diagn = "";
for (Diagnostic<? extends JavaFileObject> diagnostic : diagnostics.getDiagnostics()){
diagn+=diagnostic.getMessage(null)+"\n";//E.g. cannot find symbol symbol: variable variablename
diagn+="Error on line "+Long.toString(diagnostic.getLineNumber())+" in "+diagnostic.getSource().toUri();//E.g. Error on line 22 in ClassName.java
}
fileManager.close();
compiler.run(null, null, null, workingDir.getAbsolutePath()+File.separator+javaFileName);
return diagn;
}
Die Schüler sehen den Inhalt dieser diagn
Variable als Ergebnis für ihre Code-Einreichung.
Fun Tatsache ist, dass ich es schaffen, die className.class
in der workingDir
Verzeichnis zu bekommen, aber ich bekomme diesen Fehler aus dem for
Zyklus oben. Könnte das Problem compiler.getTask(...).call()
sein? Ich meine vielleicht compiler.run
ist in der Lage, die .class korrekt zu generieren, aber die compiler.getTask(...).call()
versucht, die .class woanders zu schreiben, ich habe keine Berechtigung zum Schreiben.
P.S. Dies ist ein hübscher Legacy-Code, also sei bitte gnädig damit. :)
Wie @Alexander gefragt, dann ist dies der Inhalt der Java-Datei:
public class Sommatore {
public int somma(int i, int j) {
return i+j;
}
public int differenza(int i, int j) {
return i-j;
}
}
Zu wenig Informationen zu schreiben. Was ist der Inhalt der Datei 'className.java'? Wenn Sie es in die IDE laden, zeigt es irgendwelche Fehler? Warum liesst du es nicht über 'fileManager.getJavaFileObjectsFromFiles()' zurück und was passiert, wenn du dies anstelle von 'JavaSourceFromString()' probierst? – Alexander
Auch: erhalten Sie irgendeine Ausgabe von 'compiler.run()'? Bitte überprüfen Sie die Protokolle. – Alexander
Soll es nicht ein gültiger Java-Quellcode sein? Ich würde mindestens erwarten 'Klasse Etwas {}' – Alexander