[英]aws lambda java : How to set the class path while compiling on the fly
我正在构建一个 AWS Lambda function,它可以即时编译 class。 但是 lambda function 会抛出错误,因为它无法找到依赖关系,即即时编译的 class 的导入语句。 我已经为所遵循的步骤提供了示例代码。
请指导我如何找到依赖项,即设置 class 路径,以便动态创建的 class 编译时不会出现任何错误
private String constructTestCode(String methodCode) throws Exception{ StringBuffer strMethod = new StringBuffer(); strMethod.append("import org.json.simple.JSONObject;"); strMethod.append("public class TestJavaFile {"); strMethod.append("public void testSample() {"); strMethod.append("JSONObject j = new JSONObject();"); strMethod.append("}"); strMethod.append("}"); return strMethod.toString(); }
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); List<String> optionList = new ArrayList<String>(); optionList.addAll(Arrays.asList("- classpath",System.getProperty("java.class.path"))); if (compiler == null) { try { Class<?> javacTool = Class.forName("com.sun.tools.javac.api.JavacTool"); Method create = javacTool.getMethod("create"); compiler = (JavaCompiler) create.invoke(null); compiler.getTask(null, null, null, optionList, null, null); } catch (Exception e) { throw new AssertionError(e); } } try { compiler.run(null, null, null, javaFile.toFile().getAbsolutePath()); } catch (Exception e) { context.getLogger().log("Exception " + e + "\n"); } return javaFile.getParent().resolve(fileName + ".class");
task customFatJar(type: Jar) { manifest { attributes 'Class-Path': configurations.runtime.files.collect { it.name }.join(' ') } baseName = 'all-in-one-jar' from { configurations.compile.collect { it.isDirectory()? it: zipTree(it) } } with jar }
/tmp/TestJavaFile.java:1: error: package org.json.simple does not exist
要编译的文件保存在 /tmp 目录中。 我无法确定存在依赖 jar 文件的路径以及如何在类路径中设置它。 请对此进行指导。
非常感谢!
这是通过将类路径设置为解决的
try {
StandardJavaFileManager standardJavaFileManager =
compiler.getStandardFileManager(null, null, null);
standardJavaFileManager.setLocation(StandardLocation.CLASS_PATH,
listFilePaths(folder, context));
File[] javaFiles = new File[] { javaFile.toFile(),
Paths.get("/tmp/JUnitTest.java").toFile() };
Iterable<? extends JavaFileObject> compilationUnits1 =
standardJavaFileManager
.getJavaFileObjectsFromFiles(Arrays.asList(javaFiles));
CompilationTask task = compiler.getTask(null, standardJavaFileManager, null,
optionList, null,
compilationUnits1);
task.call();
} catch (Exception e) {
context.getLogger().log("Exception " + e + "\n");
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.