Java 如何在我的程序中加载Jar文件?

Java 如何在我的程序中加载Jar文件?,java,Java,我正在尝试编写一个加载类和jar文件的程序。我的应用程序处理plus运算符。为此,我有2个类和一个jar文件: 1-目录D:\operatorAPI中的操作员接口jar文件(操作员接口是一个jar文件) 目录中的2-class Plus(D:\operators) 3-目录D:\source\Main中的主类: package source.main; import java.util.*; import java.io.*; import java.net.URL; import java.

我正在尝试编写一个加载类和jar文件的程序。我的应用程序处理plus运算符。为此,我有2个类和一个jar文件:

1-目录D:\operatorAPI中的操作员接口jar文件(操作员接口是一个jar文件)

目录中的2-class Plus(D:\operators)

3-目录D:\source\Main中的主类:

package source.main;

import java.util.*;
import java.io.*;
import java.net.URL;
import java.net.URLClassLoader;
import operatorAPI.*;

public class Main
{
    public static void main(String[] args)
    {
        File file = new File("D:\\");
        URI uri = file.toURI();
        URL[] urls = new URL[] {uri.toURL}
        ClassLoader classloader = new URLClassLoader (urls);
        Class clazz = classloader.loadClass("operator.Plus");

        Operator instance = (Operator) clazz.newInstance();
        int output = instance.calculate(10,20);
        System.out.println("The result is :" + output);
    }
}
但是当我在命令行中运行我的程序时,我得到了这个异常:线程“main”java.lang.NoClassDefFoundError中的异常:operatorAPI/Operator

我认为,因为操作员界面是一个jar文件,我应该将它加载到我的程序中,但我不知道如何做到这一点。
有人能帮我吗?

目前您只在类路径中使用
D:\

File file = new File("D:\\");
URI uri = file.toURI();
URL[] urls = new URL[] {uri.toURL}
ClassLoader classloader = new URLClassLoader (urls);
如果要使用jar文件,应指定:

File file = new File("D:\\operator.jar");
如果这就是您需要加载新类加载器的全部内容,那么这应该是您需要的唯一更改。请注意,您可能希望将其作为命令行参数

当您在“driver”类中使用
操作符时,您将需要在使用该操作符运行的类路径中使用它。例如:

java -cp operatorAPI.jar;. source.main.Main

在编译时,您不需要向类路径添加
operator.jar
。。。如果想法是编写一个“可插拔”系统,那么其他人应该能够在编译时添加插件,而您对它们一无所知。您的代码和插件都应该知道共享接口。

您要做的是动态加载操作符(Plus等)。如果在“D:\”下有运算符类,则加载方式是正确的。但是,JAR本身中的接口“运算符”未加载。
Plus
运算符依赖于此接口,并希望加载它。将operator.jar文件添加到类路径应该可以解决这个问题

如果还希望动态加载“Operator.jar”,请更新传递给URLClassLoader的URL

URL[] urls = new URL[] {uri.toURL, new File("PathtoOperator.jar").toURI().toURL() }

这将解决您收到的错误。

是否将D:\operatorAPI添加到类路径?您所做的只是将'D:'驱动器添加到类加载器,您实际上没有加载任何Jar文件是的,我是这样运行的:java-cp Operator.Jar source/main/main。我的老师说我应该在main类中加载Operator.Jar,但我不知道怎么做this@MadProgrammer如何在我的程序中加载jar文件?传递对一个或多个
jar
文件的有效引用,而不仅仅是一个目录。目录只是表明目录中有类文件,它不会神奇地加载itI中的jar。我应该同时加载Plus类和jarfile@soha:类在jar文件(
operator.jar
)中,不是吗?如果没有,我将进行编辑。no Plus类位于seprate包(D:\\operators.Plus)@soha:您对类名、文件名、包名和jar文件感到非常困惑。在你的评论中,你说你需要使用
operator.jar
,所以我假设
Plus
就在这里-还有
operatorAPI.jar
包含接口。你需要非常清楚你在问什么,否则真的很难帮助你。是的,你是对的,我是java新手,不知道很多规则。我有:1-operatorAPI包中的接口(d:\operatorAPI.Operator)2-operators包中的类(d:\operators.Plus)3-以及source.Main包中的主类(d:\source.main.main).现在在我的主类中,我应该在编译时加载interface和Plus classI外接程序,但没有解决。java-cp Operator.jar source/Main/MainIs Operator.jar文件在执行java命令的目录中?@KDM是的。老师说我应该在代码中加载jar文件,但我不知道怎么做。你是说我应该VE2类加载器?1-URL[]URL=newurl[]{uri.toURL,新文件(“operators.Plus”).toURI().toURL()}2-URL[]URL=newurl[]{uri.toURL,新文件(“PathtoOperator.jar”).toURI().toURL()}不,只需将jar的URL也传递给正在构建的类加载器。
java -cp operatorAPI.jar;. source.main.Main
URL[] urls = new URL[] {uri.toURL, new File("PathtoOperator.jar").toURI().toURL() }