1

我想使用 URLClassLoader 从 jar 存档中加载特定目录中的类。

项目结构如下

/
 application.jar
 /lib/
  mysql.jar
  log4j.jar
  ...
 /myClasses/
  class1.class
  class2.class
  ...

该 jar 具有以下清单:

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.3
Created-By: 1.7.0_07-b10 (Oracle Corporation)
Main-Class: de.application.start
Class-Path: lib/mysql.jar lib/log4j.jar lib/....jar

我目前所做的是遍历其中的所有文件/myClasses/并尝试加载该特定类(它们都有相同的包),如下所示:

File classDir = new File("/path/to/my/root/folder/myClasses/");
URL[] url = { classdir.toURI().toURL() };
ClassLoader loader = new URLClassLoader(url);
for (File file : classDir.listFiles()) {
    String filename = StringUtil.getFilenameWithoutExtension(file.getName());
    loader.loadClass("de.myClasses." + filename).getConstructor().newInstance();

但是,即使这些文件显然存在,我总是会收到java.lang.ClassNotFoundException: de.myClasses.class1错误消息。我究竟做错了什么?

4

2 回答 2

0

您应该根据其包将编译的类放在目录中。所以类de.myClasses.Class1应该在目录中/myClasses/de/myClasses/

于 2012-09-12T13:16:15.230 回答
0

file.getName()返回"Class1.class"而不是"Class1",对吗?删除最后 6 个字符。

此外,如果 Class1 在包中de.myClasses,它应该在

<your_base_dir>/de/myClasses

如果 Class1 在顶级包(无包)中,那么你应该要求它

loader.loadClass("Class1") // no de.mClasses. prefix
于 2012-09-12T12:53:57.750 回答