插件依赖第三方jar多版本问题兼容

This commit is contained in:
ruying408
2024-07-27 15:07:06 +08:00
parent b4c8d0cdd1
commit ec121b13c4
3 changed files with 67 additions and 13 deletions

View File

@@ -0,0 +1,15 @@
package com.cool;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequiredArgsConstructor
public class Welcome {
@RequestMapping("/")
public String welcome() {
return "welcome";
}
}

View File

@@ -9,6 +9,7 @@ import com.cool.core.config.PluginJson;
import com.cool.core.exception.CoolPreconditions;
import com.cool.core.plugin.config.DynamicJarClassLoader;
import com.cool.core.util.AnnotationUtils;
import com.cool.core.util.CompilerUtils;
import com.cool.modules.plugin.entity.PluginInfoEntity;
import com.cool.modules.plugin.service.PluginInfoService;
import java.io.File;
@@ -74,19 +75,7 @@ public class DynamicJarLoaderService {
try (JarFile jarFile = ((JarURLConnection) jarUrl.openConnection()).getJarFile()) {
Enumeration<JarEntry> entries = jarFile.entries();
while (entries.hasMoreElements()) {
JarEntry jarEntry = entries.nextElement();
if (jarEntry.getName().endsWith(".class")) {
String className = jarEntry.getName().replace('/', '.').substring(0,
jarEntry.getName().length() - 6);
try {
// 加载类
Class<?> clazz = dynamicJarClassLoader.loadClass(className);
if (AnnotationUtils.hasCoolPluginAnnotation(clazz)) {
plugins.add(clazz);
}
} catch (NoClassDefFoundError ignored) {
}
}
loadClass(entries, dynamicJarClassLoader, plugins);
}
}
@@ -99,6 +88,38 @@ public class DynamicJarLoaderService {
return pluginJson;
}
/**
* 加载class
*/
private static void loadClass(Enumeration<JarEntry> entries,
DynamicJarClassLoader dynamicJarClassLoader, List<Class<?>> plugins)
throws ClassNotFoundException {
JarEntry jarEntry = entries.nextElement();
String entryName = jarEntry.getName();
if (!entryName.endsWith(".class")) {
return;
}
String className = entryName.replace('/', '.').substring(0, entryName.length() - 6);
if (entryName.startsWith(CompilerUtils.META_INF_VERSIONS)) {
// 处理多版本类
String jdkVersion = CompilerUtils.getJdkVersion();
if (!entryName.startsWith(CompilerUtils.META_INF_VERSIONS + jdkVersion)) {
return;
}
// 替换版本目录
className = className.replace((CompilerUtils.META_INF_VERSIONS + jdkVersion).replace("/", ".") + ".", "");
}
try {
// 加载类
Class<?> clazz = dynamicJarClassLoader.loadClass(className);
if (AnnotationUtils.hasCoolPluginAnnotation(clazz)) {
plugins.add(clazz);
}
} catch (NoClassDefFoundError | UnsupportedClassVersionError ignored) {
}
}
/**
* 注册插件
*/

View File

@@ -4,6 +4,8 @@ import cn.hutool.core.io.FileUtil;
import com.mybatisflex.processor.MybatisFlexProcessor;
import java.io.File;
import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
import java.nio.charset.StandardCharsets;
import java.util.List;
import javax.annotation.processing.Processor;
@@ -17,6 +19,22 @@ import lombok.extern.slf4j.Slf4j;
@Slf4j
public class CompilerUtils {
public final static String META_INF_VERSIONS = "META-INF/versions/";
// jdk版本
private static String JVM_VERSION = null;
/**
* 获取jdk版本
*/
public static String getJdkVersion() {
if (JVM_VERSION == null) {
RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
JVM_VERSION = runtimeMXBean.getSpecVersion();
}
return JVM_VERSION;
}
/**
* 创建文件, 先删除在创建
*/