0

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

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

4

3 回答 3

2

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

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

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

于 2013-05-18T03:09:43.603 回答
1

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

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

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

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

于 2013-05-18T04:53:43.813 回答
1

是的,这是可能的。

其实不是一个漂亮的方法...

您使用一个名为 lib 的文件夹并将您的 odbc jar 放在那里,使用 lib jar 的相对路径,例如“lib/jodbc.jar”

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

我在一些应用程序中使用了这种方法并且到目前为止工作得很好。我有同样的问题,用户很难添加类路径,所以我只在我的应用程序中使用“便携式”jre 和库。

抱歉没有显示示例,但我现在正在上课。

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

赛亚。


首先,您需要在项目中添加 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);

复制资源方法:

    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;
}
于 2013-05-18T12:45:04.877 回答