是否有可能不将JDBC添加到类路径?

时间:2013-05-18 03:05:50

标签: java deployment jdbc classpath desktop-application

是否可以不将JDBC添加到CLASSPATH?只需使用源代码。

我正在创建一个连接到数据库的程序,但我不希望我的用户要求他们将JDBC添加到类路径中,这对他们来说可能太难了。是不是可以不将JDBC添加到类路径中?

3 个答案:

答案 0 :(得分:2)

不,不是。或者更准确地说,虽然可以在运行时以对用户相对不可见的方式将JDBC jar添加到运行时类路径,但是如果没有相关的驱动程序,则无法执行JDBC。

对于部署Java桌面应用程序,最好的选择通常是安装应用程序。使用Java Web Start。 JWS适用于Windows,OS X& * nix中。

这对您来说是更多的努力,但对最终用户来说是轻而易举的事。他们永远不需要知道关于运行时类路径的任何信息,也不需要了解它的内容。您还可以为他们提供方便的桌面快捷方式或菜单项来启动应用程序。

答案 1 :(得分:1)

理论上可以编写自己的JDBC驱动程序。如果您这样做,您的JDBC驱动程序将成为您的代码库的一部分,并且可能位于您的应用程序的JAR中。但这听起来像是一个非常糟糕的想法......

还可以创建一个“uber jar”,将您的代码和第三方代码组合到一个JAR文件中。但是有一个问题。某些开源许可证(例如LGPL)不允许您这样做。相反,他们可以要求许可证所涵盖的代码以一种形式提供,使最终用户 easy 将一个版本的库替换为另一个版本。 “超级罐”方法使这很困难。

但是,最好的方法是将应用程序打包为多个JAR,并安排安装程序将JAR放在正确的位置,并使用包装器脚本或自定义启动程序来确保CLASSPATH正确。

或者像@Andrew Thompson推荐的那样使用WebStart。这也有其他优点,例如提供一种简单的方法来处理更新,或检查用户的JRE安装是否是最新的。

答案 2 :(得分:1)

是的,这是可能的。

实际上并不是一个美丽的方法......

你使用一个名为lib的文件夹并把你的odbc jar放在那里,使用lib jar的相对路径,比如'lib / jodbc.jar'

您可以将jar嵌入到名为resource的文件夹中,之后每次启动应用程序时,都会查找文件夹lib / jodbc.jar,如果不存在,则可以创建文件夹并将资源文件复制到应用程序中到文件夹并完成。

我在某些应用程序中使用此方法并且到目前为止工作正常。我有同样的问题,用户添加类路径很困难,所以我只在我的应用程序中使用'portable'jre和libs。

很抱歉没有举例,但我现在在课堂上。

如果你需要更多例子,请告诉我,周一我可以回答。


首先,您需要在项目中添加lib。

如果您使用的是NetBeans,请进入项目属性,在您的lib中添加jar,但首先将一个文件夹放在项目文件夹中,名为lib并使用.jar,然后添加jar并选择相对路径


复制资源:

    //Create the /lib directory with the .jars and the service.exe
    //The resource_path is the package where are your files...
    String resource_path = "br/com/myservice/resources/";
    Util.copyResource(this.getClass().getClassLoader(), resource_path, "PAF_Service.exe", currentDirectory);

    resource_path = resource_path + "lib/";
    String directory_lib = currentDirectory + "lib/";

    File dir_lib = new File(directory_lib);
    if(!dir_lib.exists()){
        dir_lib.mkdir();
    }

    Util.copyResource(this.getClass().getClassLoader(), resource_path, "ksoap2-android-assembly-2.6.5-jar-with-dependencies.jar", directory_lib);
    Util.copyResource(this.getClass().getClassLoader(), resource_path, "log4j-1.2.17.jar", directory_lib);
    Util.copyResource(this.getClass().getClassLoader(), resource_path, "WinRun4J.jar", directory_lib);

copyResource方法:

    public static boolean copyResource(ClassLoader classLoader, String resource_path, String resource, String destiny){
    FileOutputStream fos = null;
    Boolean retorno = false;
    try {
        InputStream is = classLoader.getResourceAsStream(resource_path + resource);

        if(is == null){
            System.out.println("Resource not found! >> " + resource_path + resource);
            retorno = false;
        }

        fos = new FileOutputStream( new File(destiny, resource));
        byte[] buffer = new byte[1024];
        int read = -1;
        while( (read = is.read(buffer)) != -1 ) {
            fos.write( buffer,0,read);
        }
        fos.flush();
        fos.close();
        retorno = true;
    } catch (FileNotFoundException ex) {
        Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
    } finally {
        try {
            if(fos != null)
                fos.close();
        } catch (IOException ex) {
            Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    return retorno;
}