MCIO Plugins MCIO Plugins
首页
爱发电 (opens new window)
无法下载? (opens new window)

人间工作P

我每天都好困… 最近在学习和进行 VOCALOID 创作
首页
爱发电 (opens new window)
无法下载? (opens new window)
  • PluginBase

    • PluginBase 简介
    • 构建脚本
    • 插件元数据
    • 插件主类
    • 一些工具
    • 菜单
    • 菜单配置文件
    • Vault 经济
    • 数据库连接池
    • Adventure 支持
    • 本地化系统
    • 依赖下载
      • Libraries Resolver
      • 开始使用
      • 使用示例
      • 推荐方案
      • 注意事项
  • Item-NBT-API

  • 开发文档
  • PluginBase
2025-07-21
目录

依赖下载

<< 返回开发文档

# 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
<!-- 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

请自行配置 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

# 推荐方案

推荐与 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
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

# 注意事项

请将需要使用依赖库的类的引用,给放到其它类,而不是放在插件主类。以免在依赖开始下载之前,因为找不到类报错导致无法正常初始化。

例如,你使用 LibrariesResolver 来下载并链接 adventure-platform-bukkit,那么就尽可能不要在主类里使用 adventure 相关功能,以免未链接依赖导致报错。除非你对你写的代码会在何时执行,有十足的把握。

上次更新: 2025/08/17, 05:46:12
本地化系统
Item-NBT-API 简介

← 本地化系统 Item-NBT-API 简介→

Theme fork from Vdoing | Copyright © 2018-2025 人间工作P | 到爱发电支持我

除非特别说明,本站点所有文章均以 CC BY-SA 协议授权

《我的世界》和《Minecraft》是微软公司和 Mojang Synergies AB 的商标,本站点与微软公司等没有从属关系。

  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式