当前位置: 首页 > 知识库问答 >
问题:

aws lambda java:如何在动态编译时设置类路径

屠浩
2023-03-14

我正在构建一个AWS Lambda函数,它可以动态编译一个类。但是lambda函数抛出错误,因为它无法定位依赖项,即动态编译的类的导入语句。我已经给出了所遵循步骤的示例代码。

请指导我如何定位依赖项,即设置类路径,以便动态创建的类编译时不会出现任何错误

>

  • 正在编译的示例代码

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

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

    格拉德尔一个胖罐子

    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
    }
    

    执行lambda函数时出错

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

    要编译的文件保存在 /tmp目录中。我无法确定依赖jar文件所在的路径以及如何在类路径中设置它。请对此进行指导。

    非常感谢!

  • 共有1个答案

    孔波
    2023-03-14

    通过将类路径设置为

        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");
           }
    
     类似资料:
    • 我正在制作一个工具来动态显示运行java类的源代码。我需要一个工具来帮助我从到源代码的进行动态反编译。我知道一些反编译工具,如Jad,DJ反编译程序可以反编译一个.class文件,但我希望一个工具可以: 我需要这样的反编译工具,有人知道吗?谢谢

    • 问题内容: 我有很多jar文件要添加到我的类路径中,因此,每次编译Java文件时,都会得到如下命令: 我尝试使用: 然后: 但是根本没有添加jar:由于缺少jar,我得到了错误信息…谢谢 问题答案: 也许您想尝试使用Maven来构建您的应用程序?它真的很容易设置,并且消除了依赖管理的所有问题。 同样从Java 6开始,您可以在类路径中使用通配符: set CLASSPATH = my_libs \

    • 当我将mysql jdbc驱动程序复制到JDK的\jre\lib\ext时,它执行得非常好。现在,我想通过指定环境变量的类路径来使用jdbc。但是,这样做之后,我的程序抛出异常: “java.sql.SQLException:找不到适合jdbc的驱动程序:mysql://localhost/books" 如何设置类路径?

    • 我已经在spring boot中使用log4j2完成了日志记录。我想从属性文件动态设置日志文件路径。我已经为此编写了下面的代码,但它工作得不好。 我的财产档案。属性代码如下所示 和我的日志文件log4j2。xml代码如下所示

    • 问题内容: 有人可以告诉我在NetBeans中在哪里以及如何设置类路径吗?我想添加一个.jar文件。 问题答案: 用鼠标右键单击你的项目。 选择Properties。 在左侧单击Libraries。 下Compile tab-单击Add Jar/Folder按钮。 要么 扩展你的项目。 右键单击Libraries。 选择Add Jar/Folder。

    • 我想做的是根据滚动的数字将Imageview设置为不同的骰子侧。