gpt4 book ai didi

java - 使用 URLClassLoader 从文件加载类时发生 ClassNotFoundException

转载 作者:行者123 更新时间:2023-11-30 09:05:52 25 4
gpt4 key购买 nike

我正在使用以下代码创建一个 OdbcIniTarget 类的实例,它实现了 Target 接口(interface)。 OdbcIniTarget 类已存在于应用程序中,但位于不同的包中,现在应从不在类路径中的 target 目录加载。

...
// directory below is resolved to /D:/Workspace/<myproject>/targets/
private File targetsLocation = new File("targets");
...
private void loadTargets() {

URL url = null;
try {
url = targetsLocation.toURI().toURL();
} catch (MalformedURLException e) {

}

URL[] urls = new URL[]{ url };
URLClassLoader classLoader = new URLClassLoader(urls);

try {

Target target =
(Target)classLoader.
loadClass("ch.blah.targets.nope.OdbcIniTarget").
newInstance(); // <--- this fails hard

} catch (...) {
...
}

try {
classLoader.close();
} catch (IOException e) {

}
}

我收到以下异常。

java.lang.ClassNotFoundException: ch.blah.targets.nope.OdbcIniTarget
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at ch.blah.targets.TargetFactory.loadTargets(TargetFactory.java:74)
at ch.blah.targets.TargetFactory.<init>(TargetFactory.java:41)
at ch.blah.SomeOfMyClasses.<init>(SomeOfMyClasses.java:34)
at ch.blah.TheMainClass.main(TheMainClass.java:38)

有人知道为什么找不到该类吗?

加载的类如下所示。

package ch.blah.targets.nope;

import org.apache.log4j.Logger;

import ch.blah.utils.Utils;

public class OdbcIniTarget extends Target {

private static final Logger log = Logger.getLogger(OdbcIniTarget.class);

@Override
public boolean someMethod1() {
return false;
}

@Override
public boolean someMethod2() {
return false;
}

@Override
public boolean someMethod3() {
return false;
}

@Override
public void someMethod4() {
log.debug("Blah.");
Utils.getInstance().marshalClass(SomeClass.class);
log.debug("Finished.");
}
}

targets 目录的目录结构如下。

D:\Workspace\<myproject>\targets>dir
Volume in drive D is DATA
Volume Serial Number is 021C-EC9B

Directory of D:\Workspace\<myproject>\targets

10.07.2014 21:20 <DIR> .
10.07.2014 21:20 <DIR> ..
10.07.2014 21:31 1'278 OdbcIniTarget.java
10.07.2014 20:23 3'761 OdbcIniTargetConfiguration.java
2 File(s) 5'039 bytes
2 Dir(s) 7'328'571'392 bytes free

最佳答案

问题:

它无法加载,因为它不包含该 URL 上的类,它有 java 源

解决方案:

将那些java类编译为.class文件,然后将url传递给应该看起来像的目录

ch\blah\targets\nope\OdbcIniTarget.class

关于java - 使用 URLClassLoader 从文件加载类时发生 ClassNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24685807/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com