在 task.call() 方法中使用 glassfish4、jdk1.7 错误,
>compiler.err.cant.resolve.location.args
>padm.exforms.MemoryFileManager$JavaSourceFromString[mfm:///CM.java]]]
>cannot find symbol
symbol: method getVal(int,int)
location: class padm.exforms.CM]
and etc...
在 j2se 客户端代码工作正常,在 glassfish 服务器得到错误
示例代码;
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector();
String className = "CM";
Class<?>_class = getClassFromString(compiler, diagnostics, Arrays.asList("-g:none", "-classpath", System.getProperty("java.class.path")), className, getClassCode(className));
private Class<?> getClassFromString(JavaCompiler compiler, DiagnosticListener<JavaFileObject> listener, List<String> flags, String className, String classCode) {
MemoryFileManager mfm = new MemoryFileManager(compiler.getStandardFileManager(listener, null, null));
JavaFileObject fileObject = MemoryFileManager.makeSource(className, classCode);
CompilationTask task = compiler.getTask(null, mfm, listener, flags, null, Arrays.asList(fileObject));
if (task.call()) { //error in this call
ClassLoader cl = mfm.getClassLoader(StandardLocation.CLASS_OUTPUT);
try {
return cl.loadClass(className);
} catch (ClassNotFoundException e) {
Logger.getLogger(getClass().getName()).log(Level.SEVERE, "err:" + e);
return null;
}
} else
return null;
}
private String getClassCode(String className) {
StringBuilder sb = new StringBuilder();
sb.append("package padm.exforms;"); //also tried without this line
sb.append("import java.math.*; import java.sql.*; public class ");
sb.append(className);
sb.append(" extends ");
sb.append(ConditionManager.class.getCanonicalName());
sb.append("{public ");
sb.append(className);
sb.append("(){}");
}
如何在 glassfish4 中使用 javacompiler?我还尝试在 sun-web.xml 中设置 class-loader delegate=false,但之后 ejb bean 不起作用
谢谢