【问题标题】:Is it possible not to add JDBC to classpath? [closed]是否可以不将 JDBC 添加到类路径? [关闭]
【发布时间】:2013-05-18 03:05:49
【问题描述】:

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

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

【问题讨论】:

  • 什么类型的应用。这是?例如。网络应用、桌面应用、命令行应用。?

标签: java deployment jdbc classpath desktop-application


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    是的,这是可能的。

    其实也不是什么漂亮的办法……

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

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

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

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

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

    Cya。


    首先你需要在你的项目中添加这个库。

    如果您使用的是 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;
    }
    

    【讨论】:

    • 我真的想要一个例子,威廉谢谢你的提示。
    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-04-05
      • 2017-12-24
      • 2015-03-14
      • 1970-01-01
      • 2012-05-10
      • 1970-01-01
      • 1970-01-01
      • 2019-02-14
      相关资源
      最近更新 更多