勉强能用的依赖加载系统做好了
This commit is contained in:
parent
946adbb3eb
commit
add76a30cb
@ -0,0 +1,13 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Maven: com.ilummc.eagletdl:EagletCore:1.0">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$MAVEN_REPOSITORY$/com/ilummc/eagletdl/EagletCore/1.0/EagletCore-1.0.jar!/" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC>
|
||||||
|
<root url="jar://$MAVEN_REPOSITORY$/com/ilummc/eagletdl/EagletCore/1.0/EagletCore-1.0-javadoc.jar!/" />
|
||||||
|
</JAVADOC>
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$MAVEN_REPOSITORY$/com/ilummc/eagletdl/EagletCore/1.0/EagletCore-1.0-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
@ -1,13 +0,0 @@
|
|||||||
<component name="libraryTable">
|
|
||||||
<library name="Maven: org.ow2.asm:asm:5.2">
|
|
||||||
<CLASSES>
|
|
||||||
<root url="jar://$MAVEN_REPOSITORY$/org/ow2/asm/asm/5.2/asm-5.2.jar!/" />
|
|
||||||
</CLASSES>
|
|
||||||
<JAVADOC>
|
|
||||||
<root url="jar://$MAVEN_REPOSITORY$/org/ow2/asm/asm/5.2/asm-5.2-javadoc.jar!/" />
|
|
||||||
</JAVADOC>
|
|
||||||
<SOURCES>
|
|
||||||
<root url="jar://$MAVEN_REPOSITORY$/org/ow2/asm/asm/5.2/asm-5.2-sources.jar!/" />
|
|
||||||
</SOURCES>
|
|
||||||
</library>
|
|
||||||
</component>
|
|
13
.idea/libraries/Maven__org_ow2_asm_asm_6_1_1.xml
Normal file
13
.idea/libraries/Maven__org_ow2_asm_asm_6_1_1.xml
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Maven: org.ow2.asm:asm:6.1.1">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$MAVEN_REPOSITORY$/org/ow2/asm/asm/6.1.1/asm-6.1.1.jar!/" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC>
|
||||||
|
<root url="jar://$MAVEN_REPOSITORY$/org/ow2/asm/asm/6.1.1/asm-6.1.1-javadoc.jar!/" />
|
||||||
|
</JAVADOC>
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$MAVEN_REPOSITORY$/org/ow2/asm/asm/6.1.1/asm-6.1.1-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
13
.idea/libraries/Maven__org_projectlombok_lombok_1_16_20.xml
Normal file
13
.idea/libraries/Maven__org_projectlombok_lombok_1_16_20.xml
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Maven: org.projectlombok:lombok:1.16.20">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$MAVEN_REPOSITORY$/org/projectlombok/lombok/1.16.20/lombok-1.16.20.jar!/" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC>
|
||||||
|
<root url="jar://$MAVEN_REPOSITORY$/org/projectlombok/lombok/1.16.20/lombok-1.16.20-javadoc.jar!/" />
|
||||||
|
</JAVADOC>
|
||||||
|
<SOURCES>
|
||||||
|
<root url="jar://$MAVEN_REPOSITORY$/org/projectlombok/lombok/1.16.20/lombok-1.16.20-sources.jar!/" />
|
||||||
|
</SOURCES>
|
||||||
|
</library>
|
||||||
|
</component>
|
31
pom.xml
31
pom.xml
@ -41,7 +41,7 @@
|
|||||||
<configuration>
|
<configuration>
|
||||||
<artifactSet>
|
<artifactSet>
|
||||||
<includes>
|
<includes>
|
||||||
<include>org.ow2.asm</include>
|
<include>com.ilummc.eagletdl</include>
|
||||||
</includes>
|
</includes>
|
||||||
</artifactSet>
|
</artifactSet>
|
||||||
<createDependencyReducedPom>false</createDependencyReducedPom>
|
<createDependencyReducedPom>false</createDependencyReducedPom>
|
||||||
@ -58,10 +58,20 @@
|
|||||||
</repository>
|
</repository>
|
||||||
</repositories>
|
</repositories>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.ilummc.eagletdl</groupId>
|
||||||
|
<artifactId>EagletCore</artifactId>
|
||||||
|
<version>1.0</version>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.ow2.asm</groupId>
|
<groupId>org.ow2.asm</groupId>
|
||||||
<artifactId>asm</artifactId>
|
<artifactId>asm</artifactId>
|
||||||
<version>5.2</version>
|
<version>6.1.1</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
<version>1.16.20</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>bukkit</groupId>
|
<groupId>bukkit</groupId>
|
||||||
@ -70,6 +80,11 @@
|
|||||||
<scope>system</scope>
|
<scope>system</scope>
|
||||||
<systemPath>${basedir}/libs/1_12_R1.jar</systemPath>
|
<systemPath>${basedir}/libs/1_12_R1.jar</systemPath>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.milkbowl.vault</groupId>
|
||||||
|
<artifactId>VaultAPI</artifactId>
|
||||||
|
<version>1.6</version>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>bukkit</groupId>
|
<groupId>bukkit</groupId>
|
||||||
<artifactId>bukkit1_8</artifactId>
|
<artifactId>bukkit1_8</artifactId>
|
||||||
@ -105,13 +120,6 @@
|
|||||||
<scope>system</scope>
|
<scope>system</scope>
|
||||||
<systemPath>${basedir}/libs/com.sun.tools.jar</systemPath>
|
<systemPath>${basedir}/libs/com.sun.tools.jar</systemPath>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>lombok</groupId>
|
|
||||||
<artifactId>lombok</artifactId>
|
|
||||||
<version>1</version>
|
|
||||||
<scope>system</scope>
|
|
||||||
<systemPath>${basedir}/libs/lombok.jar</systemPath>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>placeholder</groupId>
|
<groupId>placeholder</groupId>
|
||||||
<artifactId>placeholder</artifactId>
|
<artifactId>placeholder</artifactId>
|
||||||
@ -140,11 +148,6 @@
|
|||||||
<scope>system</scope>
|
<scope>system</scope>
|
||||||
<systemPath>${basedir}/libs/TabooCode5.jar</systemPath>
|
<systemPath>${basedir}/libs/TabooCode5.jar</systemPath>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>net.milkbowl.vault</groupId>
|
|
||||||
<artifactId>VaultAPI</artifactId>
|
|
||||||
<version>1.6</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>wg</groupId>
|
<groupId>wg</groupId>
|
||||||
<artifactId>wg</artifactId>
|
<artifactId>wg</artifactId>
|
||||||
|
@ -2,7 +2,7 @@ package com.ilummc.tlib;
|
|||||||
|
|
||||||
import com.ilummc.tlib.annotations.Config;
|
import com.ilummc.tlib.annotations.Config;
|
||||||
import com.ilummc.tlib.annotations.ConfigNode;
|
import com.ilummc.tlib.annotations.ConfigNode;
|
||||||
import com.ilummc.tlib.bean.BooleanProperty;
|
import com.ilummc.tlib.bean.Property;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.plugin.java.JavaPlugin;
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
|
||||||
@ -10,7 +10,7 @@ import org.bukkit.plugin.java.JavaPlugin;
|
|||||||
public class ExampleMain extends JavaPlugin {
|
public class ExampleMain extends JavaPlugin {
|
||||||
|
|
||||||
@ConfigNode("enableUpdate")
|
@ConfigNode("enableUpdate")
|
||||||
private BooleanProperty update = new BooleanProperty(true);
|
private Property<Boolean> update = Property.of(false);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onEnable() {
|
public void onEnable() {
|
||||||
|
28
src/main/java/com/ilummc/tlib/TLib.java
Normal file
28
src/main/java/com/ilummc/tlib/TLib.java
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
package com.ilummc.tlib;
|
||||||
|
|
||||||
|
import com.ilummc.tlib.inject.TLibPluginManager;
|
||||||
|
import me.skymc.taboolib.Main;
|
||||||
|
import me.skymc.taboolib.message.MsgUtils;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
|
||||||
|
public class TLib {
|
||||||
|
|
||||||
|
@SuppressWarnings({"unchecked"})
|
||||||
|
public static void init() {
|
||||||
|
// 注入 PluginLoader 用于加载依赖
|
||||||
|
try {
|
||||||
|
Field field = Bukkit.getServer().getClass().getDeclaredField("pluginManager");
|
||||||
|
field.setAccessible(true);
|
||||||
|
field.set(Bukkit.getServer(), new TLibPluginManager());
|
||||||
|
MsgUtils.send("注入成功");
|
||||||
|
} catch (NoSuchFieldException | IllegalAccessException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
MsgUtils.warn("注入失败");
|
||||||
|
}
|
||||||
|
new File(Main.getInst().getDataFolder(), "/libs").mkdirs();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,8 +0,0 @@
|
|||||||
package com.ilummc.tlib;
|
|
||||||
|
|
||||||
public class TabooLib {
|
|
||||||
|
|
||||||
public void init() {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,5 +1,12 @@
|
|||||||
package com.ilummc.tlib.annotations;
|
package com.ilummc.tlib.annotations;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
@Target(ElementType.TYPE)
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
public @interface Config {
|
public @interface Config {
|
||||||
|
|
||||||
String name() default "config.yml";
|
String name() default "config.yml";
|
||||||
|
@ -1,5 +1,12 @@
|
|||||||
package com.ilummc.tlib.annotations;
|
package com.ilummc.tlib.annotations;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
@Target(ElementType.FIELD)
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
public @interface ConfigNode {
|
public @interface ConfigNode {
|
||||||
|
|
||||||
String value();
|
String value();
|
||||||
|
@ -1,7 +1,14 @@
|
|||||||
package com.ilummc.tlib.annotations;
|
package com.ilummc.tlib.annotations;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
@Target(ElementType.TYPE)
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
public @interface Dependencies {
|
public @interface Dependencies {
|
||||||
|
|
||||||
String[] value();
|
Dependency[] value();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
16
src/main/java/com/ilummc/tlib/annotations/Dependency.java
Normal file
16
src/main/java/com/ilummc/tlib/annotations/Dependency.java
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
package com.ilummc.tlib.annotations;
|
||||||
|
|
||||||
|
import java.lang.annotation.*;
|
||||||
|
|
||||||
|
@Target(ElementType.TYPE)
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
@Repeatable(Dependencies.class)
|
||||||
|
public @interface Dependency {
|
||||||
|
|
||||||
|
enum Type {PLUGIN, LIBRARY}
|
||||||
|
|
||||||
|
Type type();
|
||||||
|
|
||||||
|
String[] args();
|
||||||
|
|
||||||
|
}
|
18
src/main/java/com/ilummc/tlib/annotations/Logger.java
Normal file
18
src/main/java/com/ilummc/tlib/annotations/Logger.java
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
package com.ilummc.tlib.annotations;
|
||||||
|
|
||||||
|
import com.ilummc.tlib.util.TLogger;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
@Target(ElementType.FIELD)
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
public @interface Logger {
|
||||||
|
|
||||||
|
String value() default "[{0}] {1}";
|
||||||
|
|
||||||
|
int level() default TLogger.INFO;
|
||||||
|
|
||||||
|
}
|
@ -1,5 +1,12 @@
|
|||||||
package com.ilummc.tlib.annotations;
|
package com.ilummc.tlib.annotations;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
@Target(ElementType.FIELD)
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
public @interface PluginInstance {
|
public @interface PluginInstance {
|
||||||
|
|
||||||
String value();
|
String value();
|
||||||
|
@ -1,5 +1,12 @@
|
|||||||
package com.ilummc.tlib.annotations.db;
|
package com.ilummc.tlib.annotations.db;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
@Target(ElementType.TYPE)
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
public @interface SQLTable {
|
public @interface SQLTable {
|
||||||
|
|
||||||
String value();
|
String value();
|
||||||
|
@ -1,17 +0,0 @@
|
|||||||
package com.ilummc.tlib.bean;
|
|
||||||
|
|
||||||
import java.util.function.BiConsumer;
|
|
||||||
|
|
||||||
public class BooleanProperty {
|
|
||||||
|
|
||||||
private boolean property;
|
|
||||||
|
|
||||||
public BooleanProperty(boolean property) {
|
|
||||||
this.property = property;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addListener(BiConsumer<Boolean, Boolean> consumer) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,4 +1,41 @@
|
|||||||
package com.ilummc.tlib.bean;
|
package com.ilummc.tlib.bean;
|
||||||
|
|
||||||
public class Property {
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.function.BiConsumer;
|
||||||
|
|
||||||
|
public class Property<T> {
|
||||||
|
|
||||||
|
private Property(T value) {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<BiConsumer<T, T>> consumers;
|
||||||
|
|
||||||
|
private T value;
|
||||||
|
|
||||||
|
public void set(T value) {
|
||||||
|
if (value != this.value) {
|
||||||
|
if (consumers != null)
|
||||||
|
for (BiConsumer<T, T> consumer : consumers) {
|
||||||
|
consumer.accept(this.value, value);
|
||||||
|
}
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public T get() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addListener(BiConsumer<T, T> consumer) {
|
||||||
|
if (consumers == null)
|
||||||
|
consumers = new ArrayList<>();
|
||||||
|
consumers.add(consumer);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> Property<T> of(T value) {
|
||||||
|
return new Property<>(value);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
77
src/main/java/com/ilummc/tlib/dependency/TDependency.java
Normal file
77
src/main/java/com/ilummc/tlib/dependency/TDependency.java
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
package com.ilummc.tlib.dependency;
|
||||||
|
|
||||||
|
import com.ilummc.eagletdl.EagletTask;
|
||||||
|
import me.skymc.taboolib.Main;
|
||||||
|
import me.skymc.taboolib.message.MsgUtils;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
import java.util.concurrent.locks.ReentrantLock;
|
||||||
|
|
||||||
|
public class TDependency {
|
||||||
|
|
||||||
|
public static final String MAVEN_REPO = "http://repo.maven.apache.org/maven2";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 请求一个插件作为依赖,这个插件将会在所有已经添加的 Jenkins 仓库、Maven 仓库寻找
|
||||||
|
* <p>
|
||||||
|
* 阻塞线程进行下载/加载
|
||||||
|
*
|
||||||
|
* @param args 插件名称,下载地址(可选)
|
||||||
|
* @return 是否成功加载了依赖
|
||||||
|
*/
|
||||||
|
public static boolean requestPlugin(String... args) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 请求一个库作为依赖,这个库将会在 Maven Central、oss.sonatype 以及自定义的 Maven 仓库寻找
|
||||||
|
* <p>
|
||||||
|
* 阻塞线程进行下载/加载
|
||||||
|
*
|
||||||
|
* @param args 依赖名,格式为 groupId:artifactId:version
|
||||||
|
* @return 是否成功加载库,如果加载成功,插件将可以任意调用使用的类
|
||||||
|
*/
|
||||||
|
public static boolean requestLib(String... args) {
|
||||||
|
if (args[0].matches(".*:.*:.*")) {
|
||||||
|
String[] arr = args[0].split(":");
|
||||||
|
File file = new File(Main.getInst().getDataFolder(), "/libs/" + String.join("-", arr) + ".jar");
|
||||||
|
if (file.exists()) {
|
||||||
|
TDependencyLoader.addToPath(Main.getInst(), file);
|
||||||
|
return true;
|
||||||
|
} else if (downloadMaven(MAVEN_REPO, arr[0], arr[1], arr[2], file)) {
|
||||||
|
TDependencyLoader.addToPath(Main.getInst(), file);
|
||||||
|
return true;
|
||||||
|
} else return false;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean downloadMaven(String url, String groupId, String artifactId, String version, File target) {
|
||||||
|
ReentrantLock lock = new ReentrantLock();
|
||||||
|
AtomicBoolean failed = new AtomicBoolean(false);
|
||||||
|
new EagletTask()
|
||||||
|
.url(url + "/" + groupId.replace('.', '/') + "/" + artifactId + "/" + version + "/" + artifactId + "-" + version + ".jar")
|
||||||
|
.file(target)
|
||||||
|
.setThreads(8)
|
||||||
|
.setOnStart(event -> lock.lock())
|
||||||
|
.setOnProgress(event -> MsgUtils.send(" 下载速度 " + event.getSpeedFormatted()))
|
||||||
|
.setOnConnected(event -> MsgUtils.send(" 正在下载 " + String.join(":", new String[]{groupId, artifactId, version}) +
|
||||||
|
" 大小 " + event.getContentLength()))
|
||||||
|
.setOnError(event -> failed.set(true))
|
||||||
|
.setOnComplete(event -> {
|
||||||
|
lock.unlock();
|
||||||
|
MsgUtils.send(" 下载 " + String.join(":", new String[]{groupId, artifactId, version}) + " 完成");
|
||||||
|
})
|
||||||
|
.start();
|
||||||
|
try {
|
||||||
|
while (lock.tryLock()) lock.unlock();
|
||||||
|
} catch (Exception ignored) {
|
||||||
|
} finally {
|
||||||
|
lock.lock();
|
||||||
|
lock.unlock();
|
||||||
|
}
|
||||||
|
return !failed.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
package com.ilummc.tlib.dependency;
|
||||||
|
|
||||||
|
import org.bukkit.plugin.Plugin;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.net.MalformedURLException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLClassLoader;
|
||||||
|
|
||||||
|
public class TDependencyLoader {
|
||||||
|
|
||||||
|
public static synchronized void addToPath(Plugin plugin, URL url) {
|
||||||
|
try {
|
||||||
|
Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
|
||||||
|
method.setAccessible(true);
|
||||||
|
method.invoke(plugin.getClass().getClassLoader(), url);
|
||||||
|
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static synchronized void addToPath(Plugin plugin, File file) {
|
||||||
|
try {
|
||||||
|
addToPath(plugin, file.toURI().toURL());
|
||||||
|
} catch (MalformedURLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
99
src/main/java/com/ilummc/tlib/inject/DependencyInjector.java
Normal file
99
src/main/java/com/ilummc/tlib/inject/DependencyInjector.java
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
package com.ilummc.tlib.inject;
|
||||||
|
|
||||||
|
import com.ilummc.tlib.annotations.Dependencies;
|
||||||
|
import com.ilummc.tlib.annotations.Dependency;
|
||||||
|
import com.ilummc.tlib.annotations.Logger;
|
||||||
|
import com.ilummc.tlib.annotations.PluginInstance;
|
||||||
|
import com.ilummc.tlib.dependency.TDependency;
|
||||||
|
import com.ilummc.tlib.util.TLogger;
|
||||||
|
import me.skymc.taboolib.message.MsgUtils;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.plugin.Plugin;
|
||||||
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
|
||||||
|
public class DependencyInjector {
|
||||||
|
|
||||||
|
public static void inject(Plugin plugin, Object o) {
|
||||||
|
injectLogger(plugin, o);
|
||||||
|
injectPluginInstance(plugin, o);
|
||||||
|
injectDependencies(plugin, o);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void injectOnEnable(Plugin plugin) {
|
||||||
|
inject(plugin, plugin);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void onDisable(Plugin plugin) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void injectLogger(Plugin plugin, Object o) {
|
||||||
|
try {
|
||||||
|
for (Field field : o.getClass().getDeclaredFields()) {
|
||||||
|
Logger logger;
|
||||||
|
if ((logger = field.getAnnotation(Logger.class)) != null) {
|
||||||
|
field.getType().asSubclass(TLogger.class);
|
||||||
|
TLogger tLogger = new TLogger(logger.value(), plugin, logger.level());
|
||||||
|
if (!field.isAccessible())
|
||||||
|
field.setAccessible(true);
|
||||||
|
field.set(o, tLogger);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception ignored) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void injectPluginInstance(Plugin plugin, Object o) {
|
||||||
|
try {
|
||||||
|
for (Field field : o.getClass().getDeclaredFields()) {
|
||||||
|
PluginInstance instance;
|
||||||
|
if ((instance = field.getAnnotation(PluginInstance.class)) != null) {
|
||||||
|
if (!field.isAccessible())
|
||||||
|
field.setAccessible(true);
|
||||||
|
field.getType().asSubclass(JavaPlugin.class);
|
||||||
|
Plugin pl;
|
||||||
|
if ((pl = Bukkit.getPluginManager().getPlugin(instance.value())) == null) {
|
||||||
|
if (!TDependency.requestPlugin(instance.value())) {
|
||||||
|
MsgUtils.warn(plugin.getName() + " 所需的依赖插件 " + instance.value() + " 自动加载失败");
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
pl = Bukkit.getPluginManager().getPlugin(instance.value());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (pl != null)
|
||||||
|
field.set(o, pl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception ignored) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void injectDependencies(Plugin plugin, Object o) {
|
||||||
|
Dependency[] dependencies = new Dependency[0];
|
||||||
|
{
|
||||||
|
Dependencies d = o.getClass().getAnnotation(Dependencies.class);
|
||||||
|
if (d != null) dependencies = d.value();
|
||||||
|
Dependency d2 = o.getClass().getAnnotation(Dependency.class);
|
||||||
|
if (d2 != null) dependencies = new Dependency[]{d2};
|
||||||
|
}
|
||||||
|
if (dependencies.length != 0) {
|
||||||
|
MsgUtils.send("正在加载 " + plugin.getName() + " 插件所需的依赖");
|
||||||
|
for (Dependency dependency : dependencies) {
|
||||||
|
if (dependency.type() == Dependency.Type.PLUGIN)
|
||||||
|
if (TDependency.requestPlugin(dependency.args()))
|
||||||
|
MsgUtils.send(plugin.getName() + " 请求的插件 " + dependency.args()[0] + " 加载成功。");
|
||||||
|
else
|
||||||
|
MsgUtils.warn(plugin.getName() + " 请求的插件 " + dependency.args()[0] + " 加载失败。");
|
||||||
|
if (dependency.type() == Dependency.Type.LIBRARY)
|
||||||
|
if (TDependency.requestLib(dependency.args()))
|
||||||
|
MsgUtils.send(plugin.getName() + " 请求的库文件 " + String.join(":", dependency.args()) + " 加载成功。");
|
||||||
|
else
|
||||||
|
MsgUtils.send(plugin.getName() + " 请求的库文件 " + String.join(":", dependency.args()) + " 加载失败。");
|
||||||
|
}
|
||||||
|
MsgUtils.send("依赖加载完成");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
168
src/main/java/com/ilummc/tlib/inject/TLibPluginManager.java
Normal file
168
src/main/java/com/ilummc/tlib/inject/TLibPluginManager.java
Normal file
@ -0,0 +1,168 @@
|
|||||||
|
package com.ilummc.tlib.inject;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.event.Event;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.permissions.Permissible;
|
||||||
|
import org.bukkit.permissions.Permission;
|
||||||
|
import org.bukkit.plugin.*;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public class TLibPluginManager implements PluginManager {
|
||||||
|
|
||||||
|
private final PluginManager instance;
|
||||||
|
|
||||||
|
public TLibPluginManager() {
|
||||||
|
instance = Bukkit.getPluginManager();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void registerInterface(Class<? extends PluginLoader> aClass) throws IllegalArgumentException {
|
||||||
|
instance.registerInterface(aClass);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Plugin getPlugin(String s) {
|
||||||
|
return instance.getPlugin(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Plugin[] getPlugins() {
|
||||||
|
return instance.getPlugins();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isPluginEnabled(String s) {
|
||||||
|
return instance.isPluginEnabled(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isPluginEnabled(Plugin plugin) {
|
||||||
|
return instance.isPluginEnabled(plugin);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Plugin loadPlugin(File file) throws InvalidPluginException, InvalidDescriptionException, UnknownDependencyException {
|
||||||
|
return instance.loadPlugin(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Plugin[] loadPlugins(File file) {
|
||||||
|
return instance.loadPlugins(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void disablePlugins() {
|
||||||
|
instance.disablePlugins();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void clearPlugins() {
|
||||||
|
instance.clearPlugins();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void callEvent(Event event) throws IllegalStateException {
|
||||||
|
instance.callEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void registerEvents(Listener listener, Plugin plugin) {
|
||||||
|
instance.registerEvents(listener, plugin);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void registerEvent(Class<? extends Event> aClass, Listener listener, EventPriority eventPriority, EventExecutor eventExecutor, Plugin plugin) {
|
||||||
|
instance.registerEvent(aClass, listener, eventPriority, eventExecutor, plugin);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void registerEvent(Class<? extends Event> aClass, Listener listener, EventPriority eventPriority, EventExecutor eventExecutor, Plugin plugin, boolean b) {
|
||||||
|
instance.registerEvent(aClass, listener, eventPriority, eventExecutor, plugin, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void enablePlugin(Plugin plugin) {
|
||||||
|
DependencyInjector.injectOnEnable(plugin);
|
||||||
|
instance.enablePlugin(plugin);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void disablePlugin(Plugin plugin) {
|
||||||
|
DependencyInjector.onDisable(plugin);
|
||||||
|
instance.disablePlugin(plugin);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Permission getPermission(String s) {
|
||||||
|
return instance.getPermission(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addPermission(Permission permission) {
|
||||||
|
instance.addPermission(permission);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void removePermission(Permission permission) {
|
||||||
|
instance.removePermission(permission);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void removePermission(String s) {
|
||||||
|
instance.removePermission(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<Permission> getDefaultPermissions(boolean b) {
|
||||||
|
return instance.getDefaultPermissions(b);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void recalculatePermissionDefaults(Permission permission) {
|
||||||
|
instance.recalculatePermissionDefaults(permission);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void subscribeToPermission(String s, Permissible permissible) {
|
||||||
|
instance.subscribeToPermission(s, permissible);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void unsubscribeFromPermission(String s, Permissible permissible) {
|
||||||
|
instance.unsubscribeFromPermission(s, permissible);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<Permissible> getPermissionSubscriptions(String s) {
|
||||||
|
return instance.getPermissionSubscriptions(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void subscribeToDefaultPerms(boolean b, Permissible permissible) {
|
||||||
|
instance.subscribeToDefaultPerms(b, permissible);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void unsubscribeFromDefaultPerms(boolean b, Permissible permissible) {
|
||||||
|
instance.unsubscribeFromDefaultPerms(b, permissible);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<Permissible> getDefaultPermSubscriptions(boolean b) {
|
||||||
|
return instance.getDefaultPermSubscriptions(b);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<Permission> getPermissions() {
|
||||||
|
return instance.getPermissions();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean useTimings() {
|
||||||
|
return instance.useTimings();
|
||||||
|
}
|
||||||
|
}
|
27
src/main/java/com/ilummc/tlib/util/Strings.java
Normal file
27
src/main/java/com/ilummc/tlib/util/Strings.java
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
package com.ilummc.tlib.util;
|
||||||
|
|
||||||
|
public class Strings {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 优化过的 String#replace,比默认快了大概 5 倍
|
||||||
|
*
|
||||||
|
* @param template 模板替换文件
|
||||||
|
* @param args 替换的参数
|
||||||
|
* @return 替换好的字符串
|
||||||
|
*/
|
||||||
|
public static String replaceWithOrder(String template, String... args) {
|
||||||
|
char[] arr = template.toCharArray();
|
||||||
|
StringBuilder stringBuilder = new StringBuilder(template.length());
|
||||||
|
for (int i = 0; i < arr.length; i++) {
|
||||||
|
if (arr[i] == '{' && Character.isDigit(arr[Math.min(i + 1, arr.length - 1)])
|
||||||
|
&& arr[Math.min(i + 1, arr.length - 1)] - '0' < args.length
|
||||||
|
&& arr[Math.min(i + 2, arr.length - 1)] == '}') {
|
||||||
|
stringBuilder.append(args[arr[i + 1] - '0']);
|
||||||
|
i += 2;
|
||||||
|
} else
|
||||||
|
stringBuilder.append(arr[i]);
|
||||||
|
}
|
||||||
|
return stringBuilder.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
63
src/main/java/com/ilummc/tlib/util/TLogger.java
Normal file
63
src/main/java/com/ilummc/tlib/util/TLogger.java
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
package com.ilummc.tlib.util;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.plugin.Plugin;
|
||||||
|
|
||||||
|
public class TLogger {
|
||||||
|
|
||||||
|
public static final int VERBOSE = 0, FINEST = 1, FINE = 2, INFO = 3, WARN = 4, ERROR = 5, FATAL = 6;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private final String pattern;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private Plugin plugin;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
private int level;
|
||||||
|
|
||||||
|
public TLogger(String pattern, Plugin plugin, int level) {
|
||||||
|
this.pattern = pattern;
|
||||||
|
this.plugin = plugin;
|
||||||
|
this.level = level;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void verbose(String msg) {
|
||||||
|
if (level >= VERBOSE)
|
||||||
|
Bukkit.getConsoleSender().sendMessage(Strings.replaceWithOrder(pattern, plugin.getName(), msg));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void finest(String msg) {
|
||||||
|
if (level >= FINEST)
|
||||||
|
Bukkit.getConsoleSender().sendMessage(Strings.replaceWithOrder(pattern, plugin.getName(), msg));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void fine(String msg) {
|
||||||
|
if (level >= FINE)
|
||||||
|
Bukkit.getConsoleSender().sendMessage(Strings.replaceWithOrder(pattern, plugin.getName(), msg));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void info(String msg) {
|
||||||
|
if (level >= INFO)
|
||||||
|
Bukkit.getConsoleSender().sendMessage(Strings.replaceWithOrder(pattern, plugin.getName(), msg));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void warn(String msg) {
|
||||||
|
if (level >= WARN)
|
||||||
|
Bukkit.getConsoleSender().sendMessage(Strings.replaceWithOrder(pattern, plugin.getName(), msg));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void error(String msg) {
|
||||||
|
if (level >= ERROR)
|
||||||
|
Bukkit.getConsoleSender().sendMessage(Strings.replaceWithOrder(pattern, plugin.getName(), msg));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void fatal(String msg) {
|
||||||
|
if (level >= FATAL)
|
||||||
|
Bukkit.getConsoleSender().sendMessage(Strings.replaceWithOrder(pattern, plugin.getName(), msg));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,5 +1,7 @@
|
|||||||
package me.skymc.taboolib;
|
package me.skymc.taboolib;
|
||||||
|
|
||||||
|
import com.ilummc.tlib.TLib;
|
||||||
|
import com.ilummc.tlib.annotations.Dependency;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
import me.skymc.taboolib.anvil.AnvilContainerAPI;
|
import me.skymc.taboolib.anvil.AnvilContainerAPI;
|
||||||
@ -104,6 +106,8 @@ public class Main extends JavaPlugin implements Listener {
|
|||||||
public void onLoad() {
|
public void onLoad() {
|
||||||
inst = this; disable = false;
|
inst = this; disable = false;
|
||||||
|
|
||||||
|
TLib.init();
|
||||||
|
|
||||||
// 启动监控
|
// 启动监控
|
||||||
new Metrics(this);
|
new Metrics(this);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user