【问题标题】:Failed sqljdbc4 connection when in executable JAR在可执行 JAR 中时 sqljdbc4 连接失败
【发布时间】:2013-01-23 23:23:23
【问题描述】:

我有一个使用 sqljdbc4.jar 连接到 SQL Server 2008 数据库的 GUI 应用程序。如果我从命令行运行它,效果很好。

但是,一旦我将其包装到可执行 JAR 中,我会收到“找不到适合 jdbc:sqlserver://myServer:1433;databaseName=myDb 的驱动程序”错误。我知道我的 Windows 系统 CLASSPATH 一旦在 JAR 中就会被忽略,但我无法弄清楚在可执行 JAR 中包含 sqljdbc4.jar 并获得一个可移植的应用程序。

我最近尝试解决此问题的方法如下:

我的 MANIFEST.MF 文件:

Manifest-Version: 1.0
Class-Path: lib/sqljdbc4.jar
Created-By: 1.7.0_11 (Oracle Corporation)
Main-Class: MyApp

我用来编译 JAR 的命令:

jar cmf MANIFEST.MF MyApp.jar MyApp.class help.html lib

我的目录结构如下。我在 MyApp 目录中运行 jar 命令。

+ MyApp
    + lib
        - sqljdbc.jar
    - help.html
    - MANIFEST.MF
    - MyApp.class
    - MyApp.java

当我创建 JAR 并在 MyApp 目录中运行它时,它工作正常。一旦我将其从目录中拉出,我就会收到错误消息。如何让 JAR 访问内部可用的 sqljdbc.jar?

提前致谢。

【问题讨论】:

    标签: sql-server-2008 jdbc executable-jar sqljdbc


    【解决方案1】:

    当您有一个可执行 jar MyApp.jar 并在 manifest.mf 中有条目时:

    Class-Path: lib/sqljdbc4.jar
    

    这意味着 jar 对(相对)文件夹 lib 中的 sqljdbc4.jar 具有外部依赖关系。它不包含在您创建的 jar 中!所以你需要确保有一个lib-folder 包含sqljdbc4.jar 相对于那个jar 当你执行它时。所以执行时的文件夹结构需要是;

    + (a folder)
       + lib
          - sqljdbc.jar
       - MyApp.jar
    

    【讨论】:

    • 我确实注意到了这种行为,因为它在创建后在文件夹中运行良好。有没有办法让 JAR 使用我包含在其中的内部 lib/sqljdbc4.jar 文件?我怎样才能使这个易于携带?好像一动起来就没用了。
    • 不,因为这不是 jars 及其类路径的设计方式。如果你想要一个独立的 jar,你需要创建一个所谓的“fat jar”,这意味着sqljdbc.jar 的整个内容 都包含在你自己的MyApp.jar 中。我个人不会使用这个解决方案,因为我觉得它又丑又乱。
    • 那很不幸。我尝试了“胖罐”的想法,但它没有用(即使使用 JarSplice 创建)。它仍然抛出错误。这种情况的通常解决方案是什么?程序是否应该以自解压 EXE 的形式分发,以便将 MyApp.jar 和 lib 目录一起解压缩?
    • 我从不使用 fat-jars,因为我不喜欢它,所以我不能进一步评论它。是的,您通常使用安装程序、自解压存档或什至 Java Webstart 来分发您的应用程序,它负责将所有内容放在正确的位置。
    猜你喜欢
    • 2013-07-29
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多