0

我发现了很多关于这个论点的讨论,但没有任何解决方案适合我。

我想创建一个简单的插件(jar),其中还包含 jdbc 驱动程序以便工作。然后在更大的应用程序中使用此插件。

如果我像这样创建一个非常简单的 main:

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(它在主类的同一包中)。

谢谢

4

2 回答 2

0

我认为 jar 文件的位置不应该与您的包相关,更有可能是在您启动应用程序的当前工作目录中。

检查File是否真的像刚才说的A4L那样看到文件,

打印生成的 URL,这在浏览器中有效吗?

尝试

 f.toURI().toURL();
于 2014-07-24T16:11:07.630 回答
0

我找到了解决方案,从你需要做的同一个包中加载一个 jar 文件:

URL url = YourClass.class.getResource("mysql-connector-java-5.1.22.jar");
URLClassLoader child = new URLClassLoader(new URL[] { url }, YourClass.class.getClassLoader());
于 2014-07-24T16:17:30.983 回答