Java 在运行时将类从文件系统加载到应用程序

Java 在运行时将类从文件系统加载到应用程序,java,jdbc,runtime,classpath,Java,Jdbc,Runtime,Classpath,我有一个处理jdbc的应用程序。它假定可以在任何有JRE的PC上使用,但它不假定use将使用-cp命令行或更改他/她的类路径变量。所以用户在文件系统的某个地方有我的应用程序、JRE和jdbc驱动程序。现在,他或她输入数据库连接信息,包括jdbc驱动程序jar的路径,然后发出sql请求。问题是,我现在不知道如何使jdbc驱动程序类在这个应用程序中可访问。与用户向类路径显式添加驱动程序的方法相同。在这种情况下,最好的解决方案是将所需的驱动程序与应用程序一起分发,并包括一个可执行包装器或一个shell

我有一个处理jdbc的应用程序。它假定可以在任何有JRE的PC上使用,但它不假定use将使用-cp命令行或更改他/她的类路径变量。所以用户在文件系统的某个地方有我的应用程序、JRE和jdbc驱动程序。现在,他或她输入数据库连接信息,包括jdbc驱动程序jar的路径,然后发出sql请求。问题是,我现在不知道如何使jdbc驱动程序类在这个应用程序中可访问。与用户向类路径显式添加驱动程序的方法相同。

在这种情况下,最好的解决方案是将所需的驱动程序与应用程序一起分发,并包括一个可执行包装器或一个shell脚本,用于相应地设置所需的变量。这允许用户在开箱即用的情况下使用它,而不必干扰任何复杂的配置,也不需要他们下载任何额外的文件。

好的,jdbc使用
Class.forName(“org.postgresql.Driver”)以加载驱动程序。因此,一旦有了jar文件,并将其添加到类路径中,这一部分就很容易了。只需将驱动程序fqn类名散列到jar文件名中。或者您可以扫描jar以查找驱动程序类


找到jar文件后如何将其添加到类路径的简便答案。

我刚刚为您的其他帖子修改了部分内容

执行以下代码使我获得了成功

import java.io.File;
import java.lang.reflect.Constructor;
import java.net.URL;
import java.net.URLClassLoader;

public class URLClassLoaderSample {
  public static void main( String [] args ) throws Exception {
    File f = new File( "/home/ravinder/Desktop/mysql-connector-java-5.1.18-bin.jar" );
    URLClassLoader urlCl = new URLClassLoader( new URL[] { f.toURL() }, System.class.getClassLoader() );

    Class mySqlDriver = urlCl.loadClass( "com.mysql.jdbc.Driver" );
    System.out.println( mySqlDriver.newInstance() );
    System.out.println( "Is this interface? = " + mySqlDriver.isInterface() );

    Class interfaces[] = mySqlDriver.getInterfaces();
    int i = 1;
    for( Class _interface : interfaces ) {
        System.out.println( "Implemented Interface Name " + ( i++ ) + " = " + _interface.getName() );
    } // for(...)

    Constructor constructors[] = mySqlDriver.getConstructors();
    for( Constructor constructor : constructors ) {
        System.out.println( "Constructor Name = " + constructor.getName() );
        System.out.println( "Is Constructor Accessible? = " + constructor.isAccessible() );
    } // for(...)
  } // psvm(...)
} // class URLClassLoaderSample
输出如下所示:

com.mysql.jdbc.Driver@60aeb0
Is this interface? = false
Implemented Interface Name 1 = java.sql.Driver
Constructor Name = com.mysql.jdbc.Driver
Is Constructor Accessible? = false
我不明白在我的例子*(com.mysql.jdbc.Driver)中应该如何使用log4jClass变量


我希望你现在能得到它。

如果你的应用程序。有一个GUI,随驱动程序一起提供。这对用户来说很容易。这正是我所做的:。但是由于某种原因,它不起作用。java.lang.ClassNotFoundException当我使用这个Class.forName(“com.mysql.jdbc.Driver”)加载jar文件时没有错误?Class.forName使用的类加载器与加载jar文件时使用的类加载器不同。确保使用加载jar文件的那个。我使用的是SystemClass loader。Class.forName使用的加载程序是什么?它使用调用方的类加载程序,可能是SystemClass加载程序。所以您需要使用ClassLoaderCreated.loadClass(),我不能这样做。还有其他解决方案吗?@itun,你需要提供一个驱动程序,或者让他们下载。您可以在文件系统中搜索它,但这不是一个完美的解决方案。如果用户下载驱动程序,然后输入我的应用程序的路径,这并不是一个问题。从文件系统的某个地方动态加载应用程序中的驱动程序对我来说是一个问题。我仍然不能这样做,因为我没有创建或使用jdbc驱动程序。它使用JDBC框架,而不是直接使用我的代码。从我的结果来看,我可以说它不起作用。我相信你的代码是可以工作的。你能给我举个例子吗?你的代码使用com.mysql.jdbc.Driver(make import com.mysql.jdbc.Driver)编译这个依赖项,但是你在类路径中没有这个jar的情况下启动应用程序,然后在运行时加载这个jar?@itun-我们不需要显式导入数据库驱动程序。除非您想知道一些特定于驱动程序的信息,如
DriverPropertyInfo
version
等,否则您不需要特定jdbc驱动程序的引用变量。如果您有一个类,并且该类不在可搜索的类路径中,那么它显然会失败。这意味着您不应该有任何类似“
pkgd.Driver=(pkgd.Driver)Class.forName(…
)之类的直接引用。请阅读
java.sql.DriverManager
上的注释,该说明建议避免使用
Class.forName()
i.e.也就是说,您可能不需要从自定义路径加载连接器jar。