AWS лямбда-Java: Как установить путь к классу при компиляции на лету - PullRequest
0 голосов
/ 04 ноября 2019

Я создаю функцию AWS Lambda, которая компилирует класс на лету. Но лямбда-функция выдает ошибку, так как не может найти зависимости, то есть операторы импорта для класса, скомпилированного на лету. Я привел пример кода для следующих шагов.

Пожалуйста, руководство о том, как я могу найти зависимости, т.е. установить путь к классу так, чтобы класс, созданный на лету, компилировался без каких-либо ошибок

  1. Пример кода, который компилируется

    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();
    }
    
  2. JavaCompilerCode

    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");
    
  3. Жидкая банка на один жир

    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
    }
    
  4. Ошибка при выполнении лямбда-функции

    /tmp/TestJavaFile.java:1: error: package org.json.simple does not exist
    

Файл для компиляции сохраняется в каталоге / tmp. Я не могу определить путь, где присутствуют JAR-файлы зависимостей и как установить его в classpath. Пожалуйста, руководство по этому вопросу.

Большое спасибо!

1 Ответ

0 голосов
/ 07 ноября 2019

Это было решено установкой classpath как

    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");
       }
...