From 435bd2734627587fec0e576ee5906c7f228b96c4 Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 9 May 2022 18:47:02 +0800 Subject: [PATCH] fix code --- .../core/compiler/JavaFileObjectUtil.java | 53 ++++++++++++++++--- .../core/compiler/JavaSourceCompiler.java | 43 ++------------- .../core/compiler/JavaSourceCompilerTest.java | 10 ++++ .../src/test/resources/test-compile/a/A.java | 12 ++--- 4 files changed, 64 insertions(+), 54 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/compiler/JavaFileObjectUtil.java b/hutool-core/src/main/java/cn/hutool/core/compiler/JavaFileObjectUtil.java index 36915e712..7e06b3011 100644 --- a/hutool-core/src/main/java/cn/hutool/core/compiler/JavaFileObjectUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/compiler/JavaFileObjectUtil.java @@ -1,7 +1,10 @@ package cn.hutool.core.compiler; +import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.file.FileNameUtil; import cn.hutool.core.compress.ZipUtil; +import cn.hutool.core.io.resource.FileResource; +import cn.hutool.core.io.resource.Resource; import javax.tools.JavaFileObject; import java.io.File; @@ -17,26 +20,59 @@ import java.util.zip.ZipFile; */ public class JavaFileObjectUtil { + /** + * 获取指定资源下的所有待编译的java源码文件,并以{@link JavaFileObject}形式返回 + * + * + * @param resource 资源,可以为目录、文件或流 + * @return 所有待编译的 {@link JavaFileObject} + */ + public static List getJavaFileObjects(final Resource resource) { + final List result = new ArrayList<>(); + + if (resource instanceof FileResource) { + final File file = ((FileResource) resource).getFile(); + result.addAll(JavaFileObjectUtil.getJavaFileObjects(file)); + } else { + result.add(new JavaSourceFileObject(resource.getName(), resource.getStream())); + } + + return result; + } + /** * 获取指定文件下的所有待编译的java文件,并以{@link JavaFileObject}形式返回 + *
    + *
  • 如果文件为目录,则遍历目录找到目录中的.java或者.jar等文件加载之
  • + *
  • 如果文件为.jar或.zip等,解压读取其中的.java文件加载之
  • + *
* * @param file 文件或目录,文件支持.java、.jar和.zip文件 * @return 所有待编译的 {@link JavaFileObject} */ public static List getJavaFileObjects(final File file) { final List result = new ArrayList<>(); - final String fileName = file.getName(); - - if (isJavaFile(fileName)) { - result.add(new JavaSourceFileObject(file.toURI())); - } else if (isJarOrZipFile(fileName)) { - result.addAll(getJavaFileObjectByZipOrJarFile(file)); + if (file.isDirectory()) { + FileUtil.walkFiles(file, (subFile) -> result.addAll(getJavaFileObjects(file))); + } else { + final String fileName = file.getName(); + if (isJavaFile(fileName)) { + result.add(new JavaSourceFileObject(file.toURI())); + } else if (isJarOrZipFile(fileName)) { + result.addAll(getJavaFileObjectByZipOrJarFile(file)); + } } + return result; } /** - * 是否是jar 或 zip 文件 + * 是否是jar 或 zip 文件
+ * 通过扩展名判定 * * @param fileName 文件名 * @return 是否是jar 或 zip 文件 @@ -46,7 +82,8 @@ public class JavaFileObjectUtil { } /** - * 是否是java文件 + * 是否是java文件
+ * 通过扩展名判定 * * @param fileName 文件名 * @return 是否是.java文件 diff --git a/hutool-core/src/main/java/cn/hutool/core/compiler/JavaSourceCompiler.java b/hutool-core/src/main/java/cn/hutool/core/compiler/JavaSourceCompiler.java index ac9b71c87..7b8b6dbc5 100644 --- a/hutool-core/src/main/java/cn/hutool/core/compiler/JavaSourceCompiler.java +++ b/hutool-core/src/main/java/cn/hutool/core/compiler/JavaSourceCompiler.java @@ -1,5 +1,6 @@ package cn.hutool.core.compiler; +import cn.hutool.core.classloader.ClassLoaderUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.IoUtil; @@ -7,11 +8,9 @@ import cn.hutool.core.io.resource.FileResource; import cn.hutool.core.io.resource.Resource; import cn.hutool.core.io.resource.StringResource; import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.core.classloader.ClassLoaderUtil; -import cn.hutool.core.util.ObjUtil; import cn.hutool.core.net.URLUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjUtil; import javax.tools.DiagnosticCollector; import javax.tools.JavaCompiler.CompilationTask; @@ -22,11 +21,8 @@ import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; /** * Java 源码编译器 @@ -230,40 +226,9 @@ public class JavaSourceCompiler { final List list = new ArrayList<>(); for (final Resource resource : this.sourceList) { - if (resource instanceof FileResource) { - final File file = ((FileResource) resource).getFile(); - FileUtil.walkFiles(file, (subFile) -> list.addAll(JavaFileObjectUtil.getJavaFileObjects(file))); - } else { - list.add(new JavaSourceFileObject(resource.getName(), resource.getStream())); - } + list.addAll(JavaFileObjectUtil.getJavaFileObjects(resource)); } return list; } - - /** - * 通过源码Map获得Java文件对象 - * - * @param sourceCodeMap 源码Map - * @return Java文件对象集合 - */ - private Collection getJavaFileObjectByMap(final Map sourceCodeMap) { - if (MapUtil.isNotEmpty(sourceCodeMap)) { - return sourceCodeMap.entrySet().stream() - .map(entry -> new JavaSourceFileObject(entry.getKey(), entry.getValue(), CharsetUtil.UTF_8)) - .collect(Collectors.toList()); - } - return Collections.emptySet(); - } - - /** - * 通过.java文件创建Java文件对象 - * - * @param file .java文件 - * @return Java文件对象 - */ - private JavaFileObject getJavaFileObjectByJavaFile(final File file) { - return new JavaSourceFileObject(file.toURI()); - } - } diff --git a/hutool-core/src/test/java/cn/hutool/core/compiler/JavaSourceCompilerTest.java b/hutool-core/src/test/java/cn/hutool/core/compiler/JavaSourceCompilerTest.java index 66032d9dc..ce97e0236 100644 --- a/hutool-core/src/test/java/cn/hutool/core/compiler/JavaSourceCompilerTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/compiler/JavaSourceCompilerTest.java @@ -2,8 +2,10 @@ package cn.hutool.core.compiler; import cn.hutool.core.compress.ZipUtil; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.lang.Console; import cn.hutool.core.reflect.ConstructorUtil; import org.junit.Assert; +import org.junit.Ignore; import org.junit.Test; import java.io.File; @@ -16,6 +18,13 @@ import java.io.InputStream; */ public class JavaSourceCompilerTest { + @Test + @Ignore + public void compilerATest(){ + final boolean compile = CompilerUtil.compile(FileUtil.file("test-compile/a/A.java").getAbsolutePath()); + Assert.assertTrue(compile); + } + /** * 测试编译Java源码 */ @@ -29,6 +38,7 @@ public class JavaSourceCompilerTest { FileUtil.getInputStream("test-compile/a/A$1.class"), FileUtil.getInputStream("test-compile/a/A$InnerClass.class") }); + Console.log(libFile.getAbsolutePath()); final ClassLoader classLoader = CompilerUtil.getCompiler(null) .addSource(FileUtil.file("test-compile/b/B.java")) .addSource("c.C", FileUtil.readUtf8String("test-compile/c/C.java")) diff --git a/hutool-core/src/test/resources/test-compile/a/A.java b/hutool-core/src/test/resources/test-compile/a/A.java index f87d54642..9eeaef931 100755 --- a/hutool-core/src/test/resources/test-compile/a/A.java +++ b/hutool-core/src/test/resources/test-compile/a/A.java @@ -1,5 +1,6 @@ package a; +import cn.hutool.core.lang.Console; import cn.hutool.core.lang.ConsoleTable; import cn.hutool.core.lang.caller.CallerUtil; @@ -10,15 +11,12 @@ public class A { public A() { new InnerClass() {{ int i = 0; - Class caller = CallerUtil.getCaller(i); - final ConsoleTable t = new ConsoleTable(); - t.addHeader("类名", "类加载器"); - System.out.println("初始化 " + getClass() + " 的调用链为: "); - while (caller != null) { - t.addBody(caller.toString(), caller.getClassLoader().toString()); + Console.log("初始化 " + getClass() + " 的调用链为: "); + Class caller = CallerUtil.getCaller(i); + while (caller != null) { + Console.log("{} {}", caller, caller.getClassLoader()); caller = CallerUtil.getCaller(++i); } - t.print(); }}; } }