Fix Dependency
This commit is contained in:
		@@ -26,10 +26,10 @@ import java.util.concurrent.Executors;
 | 
			
		||||
 * 注意与 TabooLib4.x 版本的兼容
 | 
			
		||||
 * 可能存在同时运行的情况
 | 
			
		||||
 */
 | 
			
		||||
@Dependency(type = Dependency.Type.LIBRARY, maven = "org.slf4j:slf4j-api:1.7.25", url = "https://skymc.oss-cn-shanghai.aliyuncs.com/libs/org.slf4j-slf4j-api-1.7.25.jar")
 | 
			
		||||
@Dependency(type = Dependency.Type.LIBRARY, maven = "com.zaxxer:HikariCP:3.1.0", url = "https://skymc.oss-cn-shanghai.aliyuncs.com/libs/com.zaxxer-HikariCP-3.1.0.jar")
 | 
			
		||||
@Dependency(type = Dependency.Type.LIBRARY, maven = "org.scala-lang:scala-library:2.12.8", url = "https://skymc.oss-cn-shanghai.aliyuncs.com/libs/scala-library-2.12.8.jar")
 | 
			
		||||
@Dependency(type = Dependency.Type.LIBRARY, maven = "com.google.inject:guice:4.2.2", url = "https://skymc.oss-cn-shanghai.aliyuncs.com/libs/guice-4.2.2.jar")
 | 
			
		||||
@Dependency(maven = "org.slf4j:slf4j-api:1.7.25", url = "https://skymc.oss-cn-shanghai.aliyuncs.com/libs/org.slf4j-slf4j-api-1.7.25.jar")
 | 
			
		||||
@Dependency(maven = "com.zaxxer:HikariCP:3.1.0", url = "https://skymc.oss-cn-shanghai.aliyuncs.com/libs/com.zaxxer-HikariCP-3.1.0.jar")
 | 
			
		||||
@Dependency(maven = "org.scala-lang:scala-library:2.12.8", url = "https://skymc.oss-cn-shanghai.aliyuncs.com/libs/scala-library-2.12.8.jar")
 | 
			
		||||
@Dependency(maven = "com.google.inject:guice:4.2.2", url = "https://skymc.oss-cn-shanghai.aliyuncs.com/libs/guice-4.2.2.jar")
 | 
			
		||||
public class TabooLib {
 | 
			
		||||
 | 
			
		||||
    private static TabooLib inst = new TabooLib();
 | 
			
		||||
 
 | 
			
		||||
@@ -29,7 +29,7 @@ public class TabooLibLoader {
 | 
			
		||||
 | 
			
		||||
    static void init() {
 | 
			
		||||
        // 加载依赖
 | 
			
		||||
        TDependencyInjector.inject("TabooLib", TabooLib.class);
 | 
			
		||||
        TDependencyInjector.inject(TabooLib.getPlugin(), TabooLib.class);
 | 
			
		||||
        // 插件统计
 | 
			
		||||
        Metrics metrics = new Metrics(TabooLib.getPlugin());
 | 
			
		||||
        metrics.addCustomChart(new Metrics.SingleLineChart("plugins_using_taboolib", () -> Math.toIntExact(Arrays.stream(Bukkit.getPluginManager().getPlugins()).filter(TabooLibAPI::isDependTabooLib).count())));
 | 
			
		||||
 
 | 
			
		||||
@@ -7,12 +7,6 @@ import java.lang.annotation.*;
 | 
			
		||||
@Repeatable(Dependencies.class)
 | 
			
		||||
public @interface Dependency {
 | 
			
		||||
 | 
			
		||||
    enum Type {PLUGIN, LIBRARY}
 | 
			
		||||
 | 
			
		||||
    Type type();
 | 
			
		||||
 | 
			
		||||
    String plugin() default "";
 | 
			
		||||
 | 
			
		||||
    String maven() default "";
 | 
			
		||||
 | 
			
		||||
    String mavenRepo() default TDependency.MAVEN_REPO;
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,71 @@
 | 
			
		||||
package io.izzel.taboolib.module.dependency;
 | 
			
		||||
 | 
			
		||||
import io.izzel.taboolib.TabooLib;
 | 
			
		||||
import io.izzel.taboolib.TabooLibAPI;
 | 
			
		||||
import io.izzel.taboolib.util.Strings;
 | 
			
		||||
import org.bukkit.plugin.Plugin;
 | 
			
		||||
import org.objectweb.asm.AnnotationVisitor;
 | 
			
		||||
import org.objectweb.asm.Opcodes;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @Author 坏黑
 | 
			
		||||
 * @Since 2019-07-13 15:25
 | 
			
		||||
 */
 | 
			
		||||
public class DependencyAnnotationVisitor extends AnnotationVisitor {
 | 
			
		||||
 | 
			
		||||
    private Plugin plugin;
 | 
			
		||||
    private String maven;
 | 
			
		||||
    private String mavenRepo = TDependency.MAVEN_REPO;
 | 
			
		||||
    private String url = "";
 | 
			
		||||
 | 
			
		||||
    public DependencyAnnotationVisitor(Plugin plugin, AnnotationVisitor annotationVisitor) {
 | 
			
		||||
        super(Opcodes.ASM5, annotationVisitor);
 | 
			
		||||
        this.plugin = plugin;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void visit(String name, Object value) {
 | 
			
		||||
        switch (name) {
 | 
			
		||||
            case "maven":
 | 
			
		||||
                maven = String.valueOf(value);
 | 
			
		||||
                break;
 | 
			
		||||
            case "mavenRepo":
 | 
			
		||||
                mavenRepo = String.valueOf(value);
 | 
			
		||||
                break;
 | 
			
		||||
            case "url":
 | 
			
		||||
                url = String.valueOf(value);
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
        super.visit(name, value);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void visitEnum(String name, String descriptor, String value) {
 | 
			
		||||
        super.visitEnum(name, descriptor, value);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public AnnotationVisitor visitAnnotation(String name, String descriptor) {
 | 
			
		||||
        return new DependencyAnnotationVisitor(plugin, super.visitAnnotation(name, descriptor));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public AnnotationVisitor visitArray(String name) {
 | 
			
		||||
        return new DependencyAnnotationVisitor(plugin, super.visitArray(name));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void visitEnd() {
 | 
			
		||||
        if (maven != null) {
 | 
			
		||||
            if (TDependency.requestLib(maven, mavenRepo, url)) {
 | 
			
		||||
                TabooLibAPI.debug("  Loaded " + String.join(":", maven) + " (" + plugin.getName() + ")");
 | 
			
		||||
            } else {
 | 
			
		||||
                TabooLib.getLogger().warn(Strings.replaceWithOrder(TabooLib.getInst().getInternal().getString("DEPENDENCY-LOAD-FAIL"), plugin.getName(), String.join(":", maven)));
 | 
			
		||||
            }
 | 
			
		||||
            maven = null;
 | 
			
		||||
            mavenRepo = TDependency.MAVEN_REPO;
 | 
			
		||||
            url = "";
 | 
			
		||||
        }
 | 
			
		||||
        super.visitEnd();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,25 @@
 | 
			
		||||
package io.izzel.taboolib.module.dependency;
 | 
			
		||||
 | 
			
		||||
import org.bukkit.plugin.Plugin;
 | 
			
		||||
import org.objectweb.asm.AnnotationVisitor;
 | 
			
		||||
import org.objectweb.asm.ClassVisitor;
 | 
			
		||||
import org.objectweb.asm.Opcodes;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @Author sky
 | 
			
		||||
 * @Since 2019-7-13 15:17
 | 
			
		||||
 */
 | 
			
		||||
public class DependencyClassVisitor extends ClassVisitor {
 | 
			
		||||
 | 
			
		||||
    private Plugin plugin;
 | 
			
		||||
 | 
			
		||||
    public DependencyClassVisitor(Plugin plugin, ClassVisitor classVisitor) {
 | 
			
		||||
        super(Opcodes.ASM5, classVisitor);
 | 
			
		||||
        this.plugin = plugin;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public AnnotationVisitor visitAnnotation(String descriptor, boolean visible) {
 | 
			
		||||
        return new DependencyAnnotationVisitor(plugin, super.visitAnnotation(descriptor, visible));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,40 +1,31 @@
 | 
			
		||||
package io.izzel.taboolib.module.dependency;
 | 
			
		||||
 | 
			
		||||
import io.izzel.taboolib.TabooLib;
 | 
			
		||||
import io.izzel.taboolib.TabooLibAPI;
 | 
			
		||||
import io.izzel.taboolib.util.Strings;
 | 
			
		||||
import io.izzel.taboolib.util.Files;
 | 
			
		||||
import org.bukkit.plugin.Plugin;
 | 
			
		||||
import org.objectweb.asm.ClassReader;
 | 
			
		||||
import org.objectweb.asm.ClassVisitor;
 | 
			
		||||
import org.objectweb.asm.ClassWriter;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @author Izzel_Aliz
 | 
			
		||||
 */
 | 
			
		||||
public class TDependencyInjector {
 | 
			
		||||
 | 
			
		||||
    public static Dependency[] getDependencies(Class<?> clazz) {
 | 
			
		||||
        Dependency[] dependencies = new Dependency[0];
 | 
			
		||||
        Dependencies d = clazz.getAnnotation(Dependencies.class);
 | 
			
		||||
        if (d != null) {
 | 
			
		||||
            dependencies = d.value();
 | 
			
		||||
        }
 | 
			
		||||
        Dependency d2 = clazz.getAnnotation(Dependency.class);
 | 
			
		||||
        if (d2 != null) {
 | 
			
		||||
            dependencies = new Dependency[] {d2};
 | 
			
		||||
        }
 | 
			
		||||
        return dependencies;
 | 
			
		||||
    }
 | 
			
		||||
    private static boolean libInjected;
 | 
			
		||||
 | 
			
		||||
    public static void inject(Plugin plugin, Class<?> clazz) {
 | 
			
		||||
        inject(plugin.getName(), clazz);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void inject(String name, Class<?> clazz) {
 | 
			
		||||
        for (Dependency dependency : getDependencies(clazz)) {
 | 
			
		||||
            if (dependency.type() == Dependency.Type.LIBRARY) {
 | 
			
		||||
                if (TDependency.requestLib(dependency.maven(), dependency.mavenRepo(), dependency.url())) {
 | 
			
		||||
                    TabooLibAPI.debug("  Loaded " + String.join(":", dependency.maven()) + " (" + name + ")");
 | 
			
		||||
                } else {
 | 
			
		||||
                    TabooLib.getLogger().warn(Strings.replaceWithOrder(TabooLib.getInst().getInternal().getString("DEPENDENCY-LOAD-FAIL"), name, String.join(":", dependency.maven())));
 | 
			
		||||
                }
 | 
			
		||||
        if (!plugin.getName().equals("TabooLib") || !libInjected) {
 | 
			
		||||
            try {
 | 
			
		||||
                ClassReader classReader = new ClassReader(Files.getResource(plugin, clazz.getName().replace(".", "/") + ".class"));
 | 
			
		||||
                ClassWriter classWriter = new ClassWriter(0);
 | 
			
		||||
                ClassVisitor classVisitor = new DependencyClassVisitor(plugin, classWriter);
 | 
			
		||||
                classReader.accept(classVisitor, ClassReader.EXPAND_FRAMES);
 | 
			
		||||
                classWriter.visitEnd();
 | 
			
		||||
                classVisitor.visitEnd();
 | 
			
		||||
            } catch (Throwable t) {
 | 
			
		||||
                t.printStackTrace();
 | 
			
		||||
            } finally {
 | 
			
		||||
                libInjected = true;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
package io.izzel.taboolib.module.dependency;
 | 
			
		||||
 | 
			
		||||
import io.izzel.taboolib.common.plugin.InternalPlugin;
 | 
			
		||||
import org.bukkit.Bukkit;
 | 
			
		||||
import org.bukkit.plugin.Plugin;
 | 
			
		||||
 | 
			
		||||
@@ -16,7 +17,7 @@ public class TDependencyLoader {
 | 
			
		||||
        try {
 | 
			
		||||
            Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
 | 
			
		||||
            method.setAccessible(true);
 | 
			
		||||
            method.invoke(Bukkit.class.getClassLoader(), url);
 | 
			
		||||
            method.invoke(plugin instanceof InternalPlugin ? Bukkit.class.getClassLoader() : plugin.getClass().getClassLoader(), url);
 | 
			
		||||
        } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
 | 
			
		||||
            e.printStackTrace();
 | 
			
		||||
        }
 | 
			
		||||
@@ -29,5 +30,4 @@ public class TDependencyLoader {
 | 
			
		||||
            e.printStackTrace();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,6 @@
 | 
			
		||||
package io.izzel.taboolib.module.lite;
 | 
			
		||||
 | 
			
		||||
import org.objectweb.asm.ClassVisitor;
 | 
			
		||||
import org.objectweb.asm.FieldVisitor;
 | 
			
		||||
import org.objectweb.asm.MethodVisitor;
 | 
			
		||||
import org.objectweb.asm.Opcodes;
 | 
			
		||||
import org.objectweb.asm.*;
 | 
			
		||||
 | 
			
		||||
import java.util.stream.IntStream;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user