问题
I am using the following code to create an instance of OdbcIniTarget
class which implements the Target
interface. The OdbcIniTarget
class already exists in the application but is located in a different package and now should be loaded from the target directory which is not in the class path.
...
// 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) {
}
}
I am getting the following exception.
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)
Does someone have an idea why the class is not found?
The class which is loaded looks as follows.
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.");
}
}
The directory structure for targets directory is as follows.
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
回答1:
Problem:
It is failing to load because it doesn't contain classes at that URL, it has java source
Solution:
Compile those java classes to .class file and then pass the url to the directory which should look like
ch\blah\targets\nope\OdbcIniTarget.class
回答2:
try passing the caller's classloader as a parameter in the constructor:
URLClassLoader classLoader = new URLClassLoader(urls, getClass().class.getClassLoader());
the class is a direct child of the dir in the url, so you need no package:
Target target =
(Target)classLoader.
loadClass("OdbcIniTarget").
newInstance();
来源:https://stackoverflow.com/questions/24685807/classnotfoundexception-while-loading-a-class-from-file-with-urlclassloader