From a99dd899d6bf3af1ebeb3e1d289463a3ca3e4379 Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 3 Mar 2023 18:03:59 +0800 Subject: [PATCH] remove compiler --- README-EN.md | 2 +- .../core/compiler/CompilerException.java | 34 --- .../cn/hutool/core/compiler/CompilerUtil.java | 80 ------ .../hutool/core/compiler/DiagnosticUtil.java | 26 -- .../core/compiler/JavaClassFileManager.java | 78 ------ .../core/compiler/JavaClassFileObject.java | 60 ----- .../core/compiler/JavaFileObjectUtil.java | 112 --------- .../core/compiler/JavaSourceCompiler.java | 234 ------------------ .../core/compiler/JavaSourceFileObject.java | 90 ------- .../cn/hutool/core/compiler/package-info.java | 6 - .../core/compiler/JavaSourceCompilerTest.java | 53 ---- .../test/resources/test-compile/a/A$1.class | Bin 1679 -> 0 bytes .../test-compile/a/A$InnerClass.class | Bin 447 -> 0 bytes .../src/test/resources/test-compile/a/A.class | Bin 357 -> 0 bytes .../src/test/resources/test-compile/a/A.java | 22 -- .../src/test/resources/test-compile/b/B.class | Bin 260 -> 0 bytes .../src/test/resources/test-compile/b/B.java | 8 - .../src/test/resources/test-compile/c/C.class | Bin 260 -> 0 bytes .../src/test/resources/test-compile/c/C.java | 9 - 19 files changed, 1 insertion(+), 813 deletions(-) delete mode 100644 hutool-core/src/main/java/cn/hutool/core/compiler/CompilerException.java delete mode 100644 hutool-core/src/main/java/cn/hutool/core/compiler/CompilerUtil.java delete mode 100644 hutool-core/src/main/java/cn/hutool/core/compiler/DiagnosticUtil.java delete mode 100644 hutool-core/src/main/java/cn/hutool/core/compiler/JavaClassFileManager.java delete mode 100644 hutool-core/src/main/java/cn/hutool/core/compiler/JavaClassFileObject.java delete mode 100644 hutool-core/src/main/java/cn/hutool/core/compiler/JavaFileObjectUtil.java delete mode 100644 hutool-core/src/main/java/cn/hutool/core/compiler/JavaSourceCompiler.java delete mode 100644 hutool-core/src/main/java/cn/hutool/core/compiler/JavaSourceFileObject.java delete mode 100644 hutool-core/src/main/java/cn/hutool/core/compiler/package-info.java delete mode 100644 hutool-core/src/test/java/cn/hutool/core/compiler/JavaSourceCompilerTest.java delete mode 100644 hutool-core/src/test/resources/test-compile/a/A$1.class delete mode 100644 hutool-core/src/test/resources/test-compile/a/A$InnerClass.class delete mode 100644 hutool-core/src/test/resources/test-compile/a/A.class delete mode 100755 hutool-core/src/test/resources/test-compile/a/A.java delete mode 100644 hutool-core/src/test/resources/test-compile/b/B.class delete mode 100644 hutool-core/src/test/resources/test-compile/b/B.java delete mode 100644 hutool-core/src/test/resources/test-compile/c/C.class delete mode 100644 hutool-core/src/test/resources/test-compile/c/C.java diff --git a/README-EN.md b/README-EN.md index 20d702170..545f935ea 100755 --- a/README-EN.md +++ b/README-EN.md @@ -51,7 +51,7 @@ ------------------------------------------------------------------------------- ## 📚Introduction -**Hutool** is a small but comprehensive library of Java tools, encapsulation by static methods, reduce the cost of learning related APIs, increase productivity, and make Java as elegant as a functional programming language,let the Java be "sweet" too. +**Hutool** is a small but comprehensive library of Java tools, achieved by encapsulation through static methods, reduce the cost of learning related APIs, increase productivity, and make Java as elegant as a functional programming language,let the Java be "sweet" too. **Hutool** tools and methods from each user's crafted, it covers all aspects of the underlying code of Java development, it is a powerful tool for large project development to solve small problems, but also the efficiency of small projects; diff --git a/hutool-core/src/main/java/cn/hutool/core/compiler/CompilerException.java b/hutool-core/src/main/java/cn/hutool/core/compiler/CompilerException.java deleted file mode 100644 index 1455a4c7c..000000000 --- a/hutool-core/src/main/java/cn/hutool/core/compiler/CompilerException.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.hutool.core.compiler; - -import cn.hutool.core.exceptions.ExceptionUtil; -import cn.hutool.core.text.StrUtil; - -/** - * 编译异常 - * - * @author looly - * @since 5.5.2 - */ -public class CompilerException extends RuntimeException { - private static final long serialVersionUID = 1L; - - public CompilerException(final Throwable e) { - super(ExceptionUtil.getMessage(e), e); - } - - public CompilerException(final String message) { - super(message); - } - - public CompilerException(final String messageTemplate, final Object... params) { - super(StrUtil.format(messageTemplate, params)); - } - - public CompilerException(final String message, final Throwable throwable) { - super(message, throwable); - } - - public CompilerException(final Throwable throwable, final String messageTemplate, final Object... params) { - super(StrUtil.format(messageTemplate, params), throwable); - } -} diff --git a/hutool-core/src/main/java/cn/hutool/core/compiler/CompilerUtil.java b/hutool-core/src/main/java/cn/hutool/core/compiler/CompilerUtil.java deleted file mode 100644 index 5e50df3d2..000000000 --- a/hutool-core/src/main/java/cn/hutool/core/compiler/CompilerUtil.java +++ /dev/null @@ -1,80 +0,0 @@ -package cn.hutool.core.compiler; - -import javax.tools.DiagnosticListener; -import javax.tools.JavaCompiler; -import javax.tools.JavaFileManager; -import javax.tools.JavaFileObject; -import javax.tools.StandardJavaFileManager; -import javax.tools.ToolProvider; - -/** - * 源码编译工具类,主要封装{@link JavaCompiler} 相关功能 - * - * @author looly - * @since 5.5.2 - */ -public class CompilerUtil { - - /** - * java 编译器 - */ - public static final JavaCompiler SYSTEM_COMPILER = ToolProvider.getSystemJavaCompiler(); - - /** - * 编译指定的源码文件 - * - * @param sourceFiles 源码文件路径 - * @return 0表示成功,否则其他 - */ - public static boolean compile(final String... sourceFiles) { - return 0 == SYSTEM_COMPILER.run(null, null, null, sourceFiles); - } - - /** - * 获取{@link StandardJavaFileManager} - * - * @return {@link StandardJavaFileManager} - */ - public static StandardJavaFileManager getFileManager() { - return getFileManager(null); - } - - /** - * 获取{@link StandardJavaFileManager} - * - * @param diagnosticListener 异常收集器 - * @return {@link StandardJavaFileManager} - * @since 5.5.8 - */ - public static StandardJavaFileManager getFileManager(final DiagnosticListener diagnosticListener) { - return SYSTEM_COMPILER.getStandardFileManager(diagnosticListener, null, null); - } - - /** - * 新建编译任务 - * - * @param fileManager {@link JavaFileManager},用于管理已经编译好的文件 - * @param diagnosticListener 诊断监听 - * @param options 选项,例如 -cpXXX等 - * @param compilationUnits 编译单元,即需要编译的对象 - * @return {@link JavaCompiler.CompilationTask} - */ - public static JavaCompiler.CompilationTask getTask( - final JavaFileManager fileManager, - final DiagnosticListener diagnosticListener, - final Iterable options, - final Iterable compilationUnits) { - return SYSTEM_COMPILER.getTask(null, fileManager, diagnosticListener, options, null, compilationUnits); - } - - /** - * 获取{@link JavaSourceCompiler} - * - * @param parent 父{@link ClassLoader} - * @return {@link JavaSourceCompiler} - * @see JavaSourceCompiler#of(ClassLoader) - */ - public static JavaSourceCompiler getCompiler(final ClassLoader parent) { - return JavaSourceCompiler.of(parent); - } -} diff --git a/hutool-core/src/main/java/cn/hutool/core/compiler/DiagnosticUtil.java b/hutool-core/src/main/java/cn/hutool/core/compiler/DiagnosticUtil.java deleted file mode 100644 index 07d93f221..000000000 --- a/hutool-core/src/main/java/cn/hutool/core/compiler/DiagnosticUtil.java +++ /dev/null @@ -1,26 +0,0 @@ -package cn.hutool.core.compiler; - -import javax.tools.DiagnosticCollector; -import java.util.List; -import java.util.stream.Collectors; - -/** - * 诊断工具类 - * - * @author looly - * @since 5.5.2 - */ -public class DiagnosticUtil { - - /** - * 获取{@link DiagnosticCollector}收集到的诊断信息,以文本返回 - * - * @param collector {@link DiagnosticCollector} - * @return 诊断消息 - */ - public static String getMessages(final DiagnosticCollector collector) { - final List diagnostics = collector.getDiagnostics(); - return diagnostics.stream().map(String::valueOf) - .collect(Collectors.joining(System.lineSeparator())); - } -} diff --git a/hutool-core/src/main/java/cn/hutool/core/compiler/JavaClassFileManager.java b/hutool-core/src/main/java/cn/hutool/core/compiler/JavaClassFileManager.java deleted file mode 100644 index 7c8f79314..000000000 --- a/hutool-core/src/main/java/cn/hutool/core/compiler/JavaClassFileManager.java +++ /dev/null @@ -1,78 +0,0 @@ -package cn.hutool.core.compiler; - -import cn.hutool.core.io.resource.FileObjectResource; -import cn.hutool.core.classloader.ResourceClassLoader; -import cn.hutool.core.classloader.ClassLoaderUtil; -import cn.hutool.core.util.ObjUtil; - -import javax.tools.FileObject; -import javax.tools.ForwardingJavaFileManager; -import javax.tools.JavaFileManager; -import javax.tools.JavaFileObject; -import javax.tools.JavaFileObject.Kind; -import java.util.HashMap; -import java.util.Map; - -/** - * Java 字节码文件对象管理器 - * - *

- * 正常我们使用javac命令编译源码时会将class文件写入到磁盘中,但在运行时动态编译类不适合保存在磁盘中 - * 我们采取此对象来管理运行时动态编译类生成的字节码。 - *

- * - * @author lzpeng - * @since 5.5.2 - */ -class JavaClassFileManager extends ForwardingJavaFileManager { - - /** - * 存储java字节码文件对象映射 - */ - private final Map classFileObjectMap = new HashMap<>(); - - /** - * 加载动态编译生成类的父类加载器 - */ - private final ClassLoader parent; - - /** - * 构造 - * - * @param parent 父类加载器 - * @param fileManager 字节码文件管理器 - */ - protected JavaClassFileManager(final ClassLoader parent, final JavaFileManager fileManager) { - super(fileManager); - this.parent = ObjUtil.defaultIfNull(parent, ClassLoaderUtil::getClassLoader); - } - - /** - * 获得动态编译生成的类的类加载器 - * - * @param location 源码位置 - * @return 动态编译生成的类的类加载器 - */ - @Override - public ClassLoader getClassLoader(final Location location) { - return new ResourceClassLoader<>(this.parent, this.classFileObjectMap); - } - - /** - * 获得Java字节码文件对象 - * 编译器编译源码时会将Java源码对象编译转为Java字节码对象 - * - * @param location 源码位置 - * @param className 类名 - * @param kind 文件类型 - * @param sibling Java源码对象 - * @return Java字节码文件对象 - */ - @Override - public JavaFileObject getJavaFileForOutput(final Location location, final String className, final Kind kind, final FileObject sibling) { - final JavaFileObject javaFileObject = new JavaClassFileObject(className); - this.classFileObjectMap.put(className, new FileObjectResource(javaFileObject)); - return javaFileObject; - } - -} diff --git a/hutool-core/src/main/java/cn/hutool/core/compiler/JavaClassFileObject.java b/hutool-core/src/main/java/cn/hutool/core/compiler/JavaClassFileObject.java deleted file mode 100644 index 6db6d22f9..000000000 --- a/hutool-core/src/main/java/cn/hutool/core/compiler/JavaClassFileObject.java +++ /dev/null @@ -1,60 +0,0 @@ -package cn.hutool.core.compiler; - - -import cn.hutool.core.util.CharUtil; -import cn.hutool.core.net.url.URLUtil; - -import javax.tools.SimpleJavaFileObject; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.InputStream; -import java.io.OutputStream; - -/** - * Java 字节码文件对象,用于在内存中暂存class字节码,从而可以在ClassLoader中动态加载。 - * - * @author lzpeng - * @since 5.5.2 - */ -class JavaClassFileObject extends SimpleJavaFileObject { - - /** - * 字节码输出流 - */ - private final ByteArrayOutputStream byteArrayOutputStream; - - /** - * 构造 - * - * @param className 编译后的class文件的类名 - * @see JavaClassFileManager#getJavaFileForOutput(javax.tools.JavaFileManager.Location, java.lang.String, javax.tools.JavaFileObject.Kind, javax.tools.FileObject) - */ - protected JavaClassFileObject(final String className) { - super(URLUtil.getStringURI(className.replace(CharUtil.DOT, CharUtil.SLASH) + Kind.CLASS.extension), Kind.CLASS); - this.byteArrayOutputStream = new ByteArrayOutputStream(); - } - - /** - * 获得字节码输入流 - * 编译器编辑源码后,我们将通过此输出流获得编译后的字节码,以便运行时加载类 - * - * @return 字节码输入流 - * @see JavaClassFileManager#getClassLoader(javax.tools.JavaFileManager.Location) - */ - @Override - public InputStream openInputStream() { - return new ByteArrayInputStream(byteArrayOutputStream.toByteArray()); - } - - /** - * 获得字节码输出流 - * 编译器编辑源码时,会将编译结果输出到本输出流中 - * - * @return 字节码输出流 - */ - @Override - public OutputStream openOutputStream() { - return this.byteArrayOutputStream; - } - -} 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 deleted file mode 100644 index 7e06b3011..000000000 --- a/hutool-core/src/main/java/cn/hutool/core/compiler/JavaFileObjectUtil.java +++ /dev/null @@ -1,112 +0,0 @@ -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; -import java.util.ArrayList; -import java.util.List; -import java.util.zip.ZipFile; - -/** - * {@link JavaFileObject} 相关工具类封装 - * - * @author lzpeng, looly - * @since 5.5.2 - */ -public class JavaFileObjectUtil { - - /** - * 获取指定资源下的所有待编译的java源码文件,并以{@link JavaFileObject}形式返回 - *
    - *
  • 如果资源为目录,则遍历目录找到目录中的.java或者.jar等文件加载之
  • - *
  • 如果资源为.jar或.zip等,解压读取其中的.java文件加载之
  • - *
  • 其他情况直接读取资源流并加载之
  • - *
- * - * @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<>(); - 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 文件
- * 通过扩展名判定 - * - * @param fileName 文件名 - * @return 是否是jar 或 zip 文件 - */ - public static boolean isJarOrZipFile(final String fileName) { - return FileNameUtil.isType(fileName, "jar", "zip"); - } - - /** - * 是否是java文件
- * 通过扩展名判定 - * - * @param fileName 文件名 - * @return 是否是.java文件 - */ - public static boolean isJavaFile(final String fileName) { - return FileNameUtil.isType(fileName, "java"); - } - - /** - * 通过zip包或jar包创建Java文件对象 - * - * @param file 压缩文件 - * @return Java文件对象 - */ - private static List getJavaFileObjectByZipOrJarFile(final File file) { - final List collection = new ArrayList<>(); - final ZipFile zipFile = ZipUtil.toZipFile(file, null); - ZipUtil.read(zipFile, (zipEntry) -> { - final String name = zipEntry.getName(); - if (isJavaFile(name)) { - collection.add(new JavaSourceFileObject(name, ZipUtil.getStream(zipFile, zipEntry))); - } - }); - return collection; - } -} 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 deleted file mode 100644 index af7faace9..000000000 --- a/hutool-core/src/main/java/cn/hutool/core/compiler/JavaSourceCompiler.java +++ /dev/null @@ -1,234 +0,0 @@ -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; -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.net.url.URLUtil; -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.ObjUtil; - -import javax.tools.DiagnosticCollector; -import javax.tools.JavaCompiler.CompilationTask; -import javax.tools.JavaFileObject; -import javax.tools.StandardLocation; -import java.io.File; -import java.net.URL; -import java.net.URLClassLoader; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; - -/** - * Java 源码编译器 - *

通过此类可以动态编译java源码,并加载到ClassLoader,从而动态获取加载的类。

- *

JavaSourceCompiler支持加载的源码类型包括:

- *
    - *
  • 源码文件
  • - *
  • 源码文件源码字符串
  • - *
- * - *

使用方法如下:

- *
- *     ClassLoader classLoader = JavaSourceCompiler.create(null)
- *         .addSource(FileUtil.file("test-compile/b/B.java"))
- *         .addSource("c.C", FileUtil.readUtf8String("test-compile/c/C.java"))
- *         // 增加编译依赖的类库
- *         .addLibrary(libFile)
- *         .compile();
- *     Class<?> clazz = classLoader.loadClass("c.C");
- * 
- * - * @author lzpeng - */ -public class JavaSourceCompiler { - - /** - * 待编译的资源,支持: - * - *
    - *
  • 源码字符串,使用{@link StringResource}
  • - *
  • 源码文件、源码jar包或源码zip包,亦或者文件夹,使用{@link FileResource}
  • - *
- * 可以是 .java文件 压缩文件 文件夹 递归搜索文件夹内的zip包和jar包 - */ - private final List sourceList = new ArrayList<>(); - - /** - * 编译时需要加入classpath中的文件 可以是 压缩文件 文件夹递归搜索文件夹内的zip包和jar包 - */ - private final List libraryFileList = new ArrayList<>(); - - /** - * 编译类时使用的父类加载器 - */ - private final ClassLoader parentClassLoader; - - /** - * 创建Java源码编译器 - * - * @param parent 父类加载器 - * @return Java源码编译器 - */ - public static JavaSourceCompiler of(final ClassLoader parent) { - return new JavaSourceCompiler(parent); - } - - /** - * 构造 - * - * @param parent 父类加载器,null则使用默认类加载器 - */ - private JavaSourceCompiler(final ClassLoader parent) { - this.parentClassLoader = ObjUtil.defaultIfNull(parent, ClassLoaderUtil::getClassLoader); - } - - /** - * 向编译器中加入待编译的资源
- * 支持 .java, 文件夹, 压缩文件 递归搜索文件夹内的压缩文件和jar包 - * - * @param resources 待编译的资源,支持 .java, 文件夹, 压缩文件 递归搜索文件夹内的压缩文件和jar包 - * @return Java源码编译器 - */ - public JavaSourceCompiler addSource(final Resource... resources) { - if (ArrayUtil.isNotEmpty(resources)) { - this.sourceList.addAll(Arrays.asList(resources)); - } - return this; - } - - /** - * 向编译器中加入待编译的文件
- * 支持 .java, 文件夹, 压缩文件 递归搜索文件夹内的压缩文件和jar包 - * - * @param files 待编译的文件 支持 .java, 文件夹, 压缩文件 递归搜索文件夹内的压缩文件和jar包 - * @return Java源码编译器 - */ - public JavaSourceCompiler addSource(final File... files) { - if (ArrayUtil.isNotEmpty(files)) { - for (final File file : files) { - this.sourceList.add(new FileResource(file)); - } - } - return this; - } - - /** - * 向编译器中加入待编译的源码Map - * - * @param sourceCodeMap 源码Map key: 类名 value 源码 - * @return Java源码编译器 - */ - public JavaSourceCompiler addSource(final Map sourceCodeMap) { - if (MapUtil.isNotEmpty(sourceCodeMap)) { - sourceCodeMap.forEach(this::addSource); - } - return this; - } - - /** - * 向编译器中加入待编译的源码 - * - * @param className 类名 - * @param sourceCode 源码 - * @return Java文件编译器 - */ - public JavaSourceCompiler addSource(final String className, final String sourceCode) { - if (className != null && sourceCode != null) { - this.sourceList.add(new StringResource(sourceCode, className)); - } - return this; - } - - /** - * 加入编译Java源码时所需要的jar包,jar包中必须为字节码 - * - * @param files 编译Java源码时所需要的jar包 - * @return Java源码编译器 - */ - public JavaSourceCompiler addLibrary(final File... files) { - if (ArrayUtil.isNotEmpty(files)) { - this.libraryFileList.addAll(Arrays.asList(files)); - } - return this; - } - - /** - * 编译所有文件并返回类加载器 - * - * @return 类加载器 - */ - public ClassLoader compile() { - // 获得classPath - final List classPath = getClassPath(); - final URL[] urLs = URLUtil.getURLs(classPath.toArray(new File[0])); - final URLClassLoader ucl = URLClassLoader.newInstance(urLs, this.parentClassLoader); - if (sourceList.isEmpty()) { - // 没有需要编译的源码文件返回加载zip或jar包的类加载器 - return ucl; - } - - // 创建编译器 - final JavaClassFileManager javaFileManager = new JavaClassFileManager(ucl, CompilerUtil.getFileManager()); - - // classpath - final List options = new ArrayList<>(); - if (false == classPath.isEmpty()) { - final List cp = CollUtil.map(classPath, File::getAbsolutePath, true); - options.add("-cp"); - options.add(CollUtil.join(cp, FileUtil.isWindows() ? ";" : ":")); - } - - // 编译文件 - final DiagnosticCollector diagnosticCollector = new DiagnosticCollector<>(); - final List javaFileObjectList = getJavaFileObject(); - final CompilationTask task = CompilerUtil.getTask(javaFileManager, diagnosticCollector, options, javaFileObjectList); - try { - if (task.call()) { - // 加载编译后的类 - return javaFileManager.getClassLoader(StandardLocation.CLASS_OUTPUT); - } - } finally { - IoUtil.close(javaFileManager); - } - //编译失败,收集错误信息 - throw new CompilerException(DiagnosticUtil.getMessages(diagnosticCollector)); - } - - /** - * 获得编译源码时需要的classpath - * - * @return 编译源码时需要的classpath - */ - private List getClassPath() { - final List classPathFileList = new ArrayList<>(); - for (final File file : libraryFileList) { - final List jarOrZipFile = FileUtil.loopFiles(file, (subFile) -> JavaFileObjectUtil.isJarOrZipFile(subFile.getName())); - classPathFileList.addAll(jarOrZipFile); - if (file.isDirectory()) { - classPathFileList.add(file); - } - } - return classPathFileList; - } - - /** - * 获得待编译的Java文件对象 - * - * @return 待编译的Java文件对象 - */ - private List getJavaFileObject() { - final List list = new ArrayList<>(); - - for (final Resource resource : this.sourceList) { - list.addAll(JavaFileObjectUtil.getJavaFileObjects(resource)); - } - - return list; - } -} diff --git a/hutool-core/src/main/java/cn/hutool/core/compiler/JavaSourceFileObject.java b/hutool-core/src/main/java/cn/hutool/core/compiler/JavaSourceFileObject.java deleted file mode 100644 index d4d2ea4a7..000000000 --- a/hutool-core/src/main/java/cn/hutool/core/compiler/JavaSourceFileObject.java +++ /dev/null @@ -1,90 +0,0 @@ -package cn.hutool.core.compiler; - -import cn.hutool.core.io.IoUtil; -import cn.hutool.core.util.CharUtil; -import cn.hutool.core.net.url.URLUtil; - -import javax.tools.SimpleJavaFileObject; -import java.io.BufferedInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.URI; -import java.nio.charset.Charset; - -/** - * Java 源码文件对象,支持:
- *
    - *
  1. 源文件,通过文件的uri传入
  2. - *
  3. 代码内容,通过流传入
  4. - *
- * - * @author lzpeng - * @since 5.5.2 - */ -class JavaSourceFileObject extends SimpleJavaFileObject { - - /** - * 输入流 - */ - private InputStream inputStream; - - /** - * 构造,支持File等路径类型的源码 - * - * @param uri 需要编译的文件uri - */ - protected JavaSourceFileObject(final URI uri) { - super(uri, Kind.SOURCE); - } - - /** - * 构造,支持String类型的源码 - * - * @param className 需要编译的类名 - * @param code 需要编译的类源码 - */ - protected JavaSourceFileObject(final String className, final String code, final Charset charset) { - this(className, IoUtil.toStream(code, charset)); - } - - /** - * 构造,支持流中读取源码(例如zip或网络等) - * - * @param name 需要编译的文件名 - * @param inputStream 输入流 - */ - protected JavaSourceFileObject(final String name, final InputStream inputStream) { - this(URLUtil.getStringURI(name.replace(CharUtil.DOT, CharUtil.SLASH) + Kind.SOURCE.extension)); - this.inputStream = inputStream; - } - - /** - * 获得类源码的输入流 - * - * @return 类源码的输入流 - * @throws IOException IO 异常 - */ - @Override - public InputStream openInputStream() throws IOException { - if (inputStream == null) { - inputStream = toUri().toURL().openStream(); - } - return new BufferedInputStream(inputStream); - } - - /** - * 获得类源码 - * 编译器编辑源码前,会通过此方法获取类的源码 - * - * @param ignoreEncodingErrors 是否忽略编码错误 - * @return 需要编译的类的源码 - * @throws IOException IO异常 - */ - @Override - public CharSequence getCharContent(final boolean ignoreEncodingErrors) throws IOException { - try(final InputStream in = openInputStream()){ - return IoUtil.readUtf8(in); - } - } - -} diff --git a/hutool-core/src/main/java/cn/hutool/core/compiler/package-info.java b/hutool-core/src/main/java/cn/hutool/core/compiler/package-info.java deleted file mode 100644 index a0f3ef2b4..000000000 --- a/hutool-core/src/main/java/cn/hutool/core/compiler/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * 运行时编译java源码,动态从字符串或外部文件加载类 - * - * @author : Lzpeng - */ -package cn.hutool.core.compiler; \ No newline at end of file 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 deleted file mode 100644 index ce97e0236..000000000 --- a/hutool-core/src/test/java/cn/hutool/core/compiler/JavaSourceCompilerTest.java +++ /dev/null @@ -1,53 +0,0 @@ -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; -import java.io.InputStream; - -/** - * Java源码编译器测试 - * - * @author lzpeng - */ -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源码 - */ - @Test - public void testCompile() throws ClassNotFoundException { - // 依赖A,编译B和C - final File libFile = ZipUtil.zip(FileUtil.file("lib.jar"), - new String[]{"a/A.class", "a/A$1.class", "a/A$InnerClass.class"}, - new InputStream[]{ - FileUtil.getInputStream("test-compile/a/A.class"), - 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")) - .addLibrary(libFile) -// .addLibrary(FileUtil.file("D:\\m2_repo\\cn\\hutool\\hutool-all\\5.5.7\\hutool-all-5.5.7.jar")) - .compile(); - final Class clazz = classLoader.loadClass("c.C"); - final Object obj = ConstructorUtil.newInstance(clazz); - Assert.assertTrue(String.valueOf(obj).startsWith("c.C@")); - } - -} diff --git a/hutool-core/src/test/resources/test-compile/a/A$1.class b/hutool-core/src/test/resources/test-compile/a/A$1.class deleted file mode 100644 index 78aff511d2899e9b4560c2ec7a0e5d2260291e01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1679 zcma)6TW=dh6#gb&XPxah7dvj_kb)^`vE7TCQYgeBkeHT+I!VE;gDJO-JxMm*>{|A^ zC=xG}J|Hd<5(o(-B;MM`wi27DQTmF+FX#`zO8FC%GrJ9r(^kdnotZsz<~!dxbI$qm zpF4K}oWzQX4u+tfnHU~Xp)hpI<&C#5`XWl1n*ScWss5Kej$ zZ%7pxl$>1=U0~S55k#kk0Kyz9x)}yqsyo25siKBnL{#)K94uRzrG{hMW~OY{M8?#u z#Y|Z@O;O9_yy>E2m>f~`GjuHq#}_j6C#O>RW&MioAMt2sRqSO*JPtBvTXowM7xZ~k zXoz7zQj9YMlBuGKXBc{0SOuqMSc@U-C$G0|Z8X3CE`;Y8xLkkz+x^YW=Fc}I#`7Ep z@B-1&E0wcCuZSAMspO>{tbC+wD*rS}*)AN!iz*Ja6Irc0Vud4#6fw0M4nxdGH|)%L zBI%F;p|6nNhZ*+m_F%GMm_#asqYPT}t6!VfziEE^Q$j-;8R5nG#JtdJodXs~oRkltQRitHP=<9NlTlN2AC*fpj*6F@{KD z>z8ZyZ+^M;vA!ZjC4*f58$8+p$O3sNRAdhzBw6aiBh&+!LGKh@sb8QBeLJqtuRv0uEIsh_glE{>ZgaJ| zZMT0n>R5W5tcMGZUcNl7S3Pw|KJq)X^kKFJ9vI)hj-F9v z1F_N?_KgPP!QdtaOM%Exp`=8fEx1U`-Nx_+(xu3eH5^O37;$kbl6CRAi#J`obseeg zLvdvtQ*B}Ivx;wrwXQGf&MhjsAPhgSO80;(E$U?G%HxZ04~!iLNXas`3sQLM906$ C`lH|g diff --git a/hutool-core/src/test/resources/test-compile/a/A$InnerClass.class b/hutool-core/src/test/resources/test-compile/a/A$InnerClass.class deleted file mode 100644 index ad922c85f0fb829e396f11664d0b3fcf6ce9f8f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 447 zcmZut%SyvQ6g@XdlQzaS)>nNjToma8j0<;)Pzr(&bfI)Vjf1Ad1d`PMav=p5et;h( z-Wv-Qk%2oiXU;w6p85QG{{V1?Lk9+-se)1WI!$#xPE=7iun7K4y{I5j>0@v^o$06~ z*yU4PbWaJjkQ>e!xQNrZyd>0n71Ey&ta0|B8z8KCsKIt&V%>v-Cc*3pp%uodzL`Hy zb$+j=i6*qeEK8n@_?9qv& zA$Y5hnq%(sOf1jr6^xdZNC_{L=c@3rEzxZ2DCbA7H} ob#}3VHUx06xl}mjesQn|!v(hf?-mCGJ5}99hj&Rw*uw#gZWmnT8N58#Iq zXIG(nc#nC^Z)W!U=i>{&84f~tgr3Z1A$-DUDPLt)N%NH56-!ligy2FO-Cc6i-~r1aV)lno?bB3k0(hdmJIUF-A4>O17y5To*V5pU!^;JC8=d z8gg~TDY3`XcWit@OxdG14m=E569) caller = CallerUtil.getCaller(i); - while (caller != null) { - Console.log("{} {}", caller, caller.getClassLoader()); - caller = CallerUtil.getCaller(++i); - } - }}; - } -} diff --git a/hutool-core/src/test/resources/test-compile/b/B.class b/hutool-core/src/test/resources/test-compile/b/B.class deleted file mode 100644 index ed23f2757a9207be24aebd5d9d31f9ffe7bb315a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 260 zcmXYryH3ME5Jk^8evpkxLihqYpui0s4=F)PWrYHier;B;k+CJ?@LyDsK;i@VD8x9T zxubjc+}Zj0{rm4J!{hZww8&`HheC=!B-70i?wid#>=E)fb z3{xWFgpt13Y;G_Ng-Pyfx7xlIu6?vc<%C(@l(t&i*7yED47(TqCPcY@d?lENX4{r- z>H9*wxahCo1l_DhqEk^~)kNLR-oxm8$H5n7NBW_0z@h4RUx^46H;RunOSPal6Q(+a IBh`S}AMYY6h5!Hn diff --git a/hutool-core/src/test/resources/test-compile/b/B.java b/hutool-core/src/test/resources/test-compile/b/B.java deleted file mode 100644 index 84c294dea..000000000 --- a/hutool-core/src/test/resources/test-compile/b/B.java +++ /dev/null @@ -1,8 +0,0 @@ -package b; -import a.A; - -public class B { - public B() { - new A(); - } -} \ No newline at end of file diff --git a/hutool-core/src/test/resources/test-compile/c/C.class b/hutool-core/src/test/resources/test-compile/c/C.class deleted file mode 100644 index 42966eed7c45baee48b4b4abc8ec58ea94e8442a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 260 zcmXYry-veG5QM*VoO5z9B!nlR0}9;G@l#-l%7Oxv{%lTgk+CJ?@Lp7rK;i*-D8xFV znbGXd?9R{c=QnW9VL~K~sw_{4g~i&vyR3H2b9P^@ebo!*GBlyTR@3pxN{I9J$y-KD zQ^uHtnQqGL#$uTY^CC3