当前位置: 首页 > 知识库问答 >
问题:

从不同文件夹加载Jar文件

齐朝明
2023-03-14

我目前正在制作一个Minecraft Mod Loader。

package spideyzac;

import java.util.concurrent.CopyOnWriteArrayList;

import org.lwjgl.opengl.Display;

import spideyzac.Module;

public class Client {
    
    public static String name = "Pizza Mod Loader", version = "1";
    public static CopyOnWriteArrayList<Module> modules = new CopyOnWriteArrayList<Module>();
    
    public static void startup() {
        Display.setTitle(name + " v" + version);
    }
    
    public static void onKey(int key) {
        for (Module m : modules) {
            if (m.keyCode == key) {
                m.toggle();
            }
        }
    }
    
    public static void update() {
        for (Module m : modules) {
            if (m.isEnabled()) {
                m.ifEnabled();
            } else {
                m.ifNotEnabled();
            }
        }
    }
    
}

正如您在上面看到的,我有一个名为Client的类。当Minecraft游戏启动时,启动被调用。现在我有一个名为Mods的文件夹,在调用startup时,我需要将Mods从Mods文件夹加载到ArrayList命名模块中。更深入地说,每个Mod将有一个继承这个模块类的主类

package spideyzac;

import org.lwjgl.input.Keyboard;

import net.minecraft.client.Minecraft;

public class Module {

    public static int keyCode;
    public static String name;
    public static boolean enabled;
    public Minecraft mc = Minecraft.getMinecraft();
    
    Module (int keyCode, String name) {
        this.keyCode = keyCode;
        this.name = name;
    }
    
    public void onEnable() {
        
    }
    
    public void onDisable() {
        
    }
    
    public void toggle() {
        enabled = !enabled;
        if (enabled) {
            onEnable();
        } else {
            onDisable();
        }
    }
    
    public void ifEnabled() {
        
    }
    
    public void ifNotEnabled() {
        
    }
    
    
    public static boolean isEnabled() {
        return enabled;
    }
    
    public static int getKeyCode() {
        return keyCode;
    }
    
    public static boolean checkKey(int key) {
        return Keyboard.isKeyDown(key);
    }
    
}

因此,在调用startup时,我需要遍历mods文件夹中的每个Mod,并将模块主类的新实例添加到ArrayList模块中。

共有1个答案

漆雕育
2023-03-14

有一个名为URLClassLoader的类。

顾名思义,它可以从URL加载类:

File[] files=new File("Mods").listFiles();
URL[] urls=new URL[files.length];
for(int i=0;i<files.length;i++){
    urls[i]=files[i].toURI().toURL();
}
URLClassLoader modLoader=new URLClassLoader(urls);

一行:

URLClassLoader modLoader=new URLClassLoader(Stream.of(new File("Mods").list()).map(file->file.toURI().toURL()).toArray(URL[]::new));

还可以为每个JAR创建一个ClassLoader。

File[] files=new File("Mods").listFiles();
for(int i=0;i<files.length;i++){
    URL url=files[i].toURI().toURL();
    URLClassLoader modLoader=new URLClassLoader(url);
}

然后,如果您知道包名称,则可以加载类:

Class<?> cl=modLoader.loadClass("fully.qualified.name");
Object o=cl.getDeclaredConstructor().newInstance();
if(o instanceof Module){
    modules.add((Module)o);
}

如果不知道类名,可以使用名为Reflections的库来获取对象。

 类似资料:
  • 问题内容: 这就是我自动加载文件夹中所有类的方式, 但是我的文件夹中也有类,我也想自动加载它们-我该怎么办?我应该复制上面的自动加载并仅将路径更改为(但是不是重复吗?)? 谢谢。 编辑: 这些是我在控制器文件夹中的类文件名: 这些是我在模型文件夹中的类文件名: 通常这就是我命名控制器类类的方式(我使用下划线和小写), 这通常是我为模型类类命名的方式(我使用下划线和小写), 问题答案: 您应该命名您

  • 我在maven项目的src/main/resource文件夹中下载了.sh文件,我正在通过下面的代码阅读它 如果我使用jar EX作为应用程序运行:- java-jar runscript.jar SCHEMA_NAME /users/ideaprojects/runscript/target/file:/users/ideaprojects/runscript/target/runscripts

  • 我有两个jar文件。第一个只包含接口 在请求的基础上,我试图从中加载我的实现类。jar文件存在于某个文件夹中,在运行时使用URLClassLoader。 课程正在加载 我确信这是由于我使用不同的类加载器来加载类,但是我如何克服类之间的兼容性问题。 同样的代码可以在正常的J2SE环境中工作,但不能在JBoss环境中工作。 如果我的查询不清楚,请让我知道我也可以粘贴源代码。

  • 我一直在尝试制作可以读取与它相同目录中的csv文件的jar应用程序。然而,事实证明这很困难,因为我目前访问该文件的方法是: 它适用于在IDE中运行的程序和测试,但在从编译的jar文件运行程序时不起作用。我不知道如何让它对这两者都起作用。我真的不能理解这个路径的东西,似乎有一百万种方法可以做到这一点,其中只有一种只适用于一个特定的场景。

  • 问题内容: 我已经尝试搜索,但仍然没有解决方案。当我导出到jar文件时,我的所有图像突然不再起作用。它们在Eclipse中运行良好,并且我已确保它们在jar文件中。我尝试使用get资源方法并制作一个图像加载器类来自动向上目录树,但它仍然失败。这是我所做的: 我将发送的路径如下所示:“ doc / icon.png” 我将所有图像放置在doc文件夹中,结构是最终项目,在内部有doc文件夹,然后是sr

  • 我从我的IntelliJ Java 15 Gradle项目的resources文件夹中的子文件夹加载文件时遇到问题...