Java 如何在我的程序中加载Jar文件?
我正在尝试编写一个加载类和jar文件的程序。我的应用程序处理plus运算符。为此,我有2个类和一个jar文件: 1-目录D:\operatorAPI中的操作员接口jar文件(操作员接口是一个jar文件) 目录中的2-class Plus(D:\operators) 3-目录D:\source\Main中的主类: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.
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() }