我发现很多关于这个论点的讨论,但没有解决方案适合我。
我想创建一个简单的插件(jar),它也包含jdbc驱动程序才能工作。这个插件在一个更大的应用程序中使用。
如果我创建一个非常简单的主要内容:
public static void main(String[] args) {
URL url;
try {
File f = new File("mysql-connector-java-5.1.22.jar");
URLClassLoader child = new URLClassLoader(new URL[] { f.toURL() }, Plugin.class.getClassLoader());
Class classToLoad = Class.forName("com.mysql.jdbc.Driver", true, child);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
我总是这个例外:
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:340)
似乎Class.forName无法找到我的Plugin类的同一个包中的jar。
我尝试了很多解决方案,但没有人适合我。有可能加载jar而不直接引用它(它在主类的同一个包中)。
由于
答案 0 :(得分:0)
我不认为jar文件的位置应该与您的Package相关,更可能是在您启动应用程序的当前工作目录中。
检查文件是否实际上将文件视为A4L,只是说,
打印生成的URL,在浏览器中有效吗?
尝试
f.toURI().toURL();
答案 1 :(得分:0)
我找到了解决方案,从您需要执行的同一个包中加载jar文件:
URL url = YourClass.class.getResource("mysql-connector-java-5.1.22.jar");
URLClassLoader child = new URLClassLoader(new URL[] { url }, YourClass.class.getClassLoader());