依赖下载
# Libraries Resolver
用于在插件刚实例化完成时下载依赖库,这个模块大约占用你的插件 1.62 MB
的储存空间 (最新版)。
# 开始使用
获取版本:Maven Central (opens new window)
(LibrariesResolver 与 PluginBase 版本号同步)
repositories {
mavenCentral()
}
// Gradle
dependencies {
implementation("top.mrxiaom:LibrariesResolver:$VERSION:all") { isTransitive = false }
}
1
2
3
4
5
6
7
2
3
4
5
6
7
<!-- Maven -->
<dependencies>
<dependency>
<groupId>top.mrxiaom</groupId>
<artifactId>LibrariesResolver</artifactId>
<version>$VERSION</version>
<classifier>all</classifier>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
请自行配置 shadowJar
或 maven-shade-plugin
,并做好 relocation
操作,LibrariesResolver 需要打包到你的程序内。
# 使用示例
public static void resolveLibraries(Logger logger) {
// 下载的依赖存在哪里
File librariesDir = new File("libraries");
// 创建依赖解决器,可以指定仓库,默认使用 华为云镜像 + Maven Central 官方
DefaultLibraryResolver resolver = new DefaultLibraryResolver(logger, librariesDir);
// 添加依赖声明
resolver.addLibrary("net.kyori:adventure-text-minimessage:4.21.0");
// 执行获取依赖
List<URL> libraries = resolver.doResolve();
for (URL url : libraries) {
logger.info("找到依赖: " + url.toString());
}
// TODO: 将 libraries 添加到 URLClassLoader 中即可
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 推荐方案
推荐与 buildconfig
一同使用,同步构建脚本与运行时插件的依赖信息。
plugins {
id("java")
id("com.github.gmazzo.buildconfig") version "5.6.7"
}
val libraries = arrayListOf<String>()
fun DependencyHandlerScope.library(dependencyNotation: String) {
compileOnly(dependencyNotation)
libraries.add(dependencyNotation)
}
dependencies {
library("net.kyori:adventure-api:4.22.0")
library("net.kyori:adventure-platform-bukkit:4.4.0")
library("net.kyori:adventure-text-serializer-gson:4.22.0")
library("net.kyori:adventure-text-minimessage:4.22.0")
implementation("top.mrxiaom:LibrariesResolver:$VERSION:all") { isTransitive = false }
}
buildConfig {
className("BuildConstants")
packageName("com.example.your.plugin")
val librariesVararg = libraries.joinToString(", ") { "\"$it\"" }
// buildConfigField("String", "VERSION", "\"${project.version}\"")
// buildConfigField("java.time.Instant", "BUILD_TIME", "java.time.Instant.ofEpochSecond(${System.currentTimeMillis() / 1000L}L)")
buildConfigField("String[]", "LIBRARIES", "new String[] { $librariesVararg }")
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package com.example.your.plugin;
import top.mrxiaom.pluginbase.resolver.DefaultLibraryResolver;
import top.mrxiaom.pluginbase.resolver.aether.repository.RemoteRepository;
import top.mrxiaom.pluginbase.resolver.utils.ClassLoaderWrapper;
import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.List;
import java.util.logging.Logger;
/**
* 插件主类
*/
public class ExamplePlugin extends JavaPlugin {
private final ClassLoaderWrapper classLoader;
public ExamplePlugin() throws Exception {
this.classLoader = new ClassLoaderWrapper((URLClassLoader) getClassLoader());
Logger logger = this.getLogger();
logger.info("正在检查依赖库状态");
File librariesDir = new File(this.getDataFolder(), "libraries");
DefaultLibraryResolver resolver = new DefaultLibraryResolver(logger, librariesDir);
// 也可以使用其它仓库。为了精简本项目大小,不支持需要身份验证的仓库,只支持公开仓库
// List<RemoteRepository> repositories = Arrays.asList(
// new RemoteRepository.Builder("papermc", "default", "https://repo.papermc.io/repository/maven-public").build(),
// new RemoteRepository.Builder("codemc", "default", "https://repo.codemc.io/repository/maven-public").build()
// );
// DefaultLibraryResolver resolver = new DefaultLibraryResolver(logger, librariesDir, repositories);
resolver.addLibrary(BuildConstants.LIBRARIES);
List<URL> libraries = resolver.doResolve();
logger.info("正在添加 " + libraries.size() + " 个依赖库到类加载器");
for (URL library : libraries) {
this.classLoader.addURL(library);
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 注意事项
请将需要使用依赖库的类的引用,给放到其它类,而不是放在插件主类。以免在依赖开始下载之前,因为找不到类报错导致无法正常初始化。
例如,你使用 LibrariesResolver 来下载并链接
adventure-platform-bukkit
,那么就尽可能不要在主类里使用 adventure 相关功能,以免未链接依赖导致报错。除非你对你写的代码会在何时执行,有十足的把握。
上次更新: 2025/08/17, 05:46:12