当库被提取到可运行的 jar 中时,JDBC 运行良好,但在它们刚刚打包时运行良好

Posted

技术标签:

【中文标题】当库被提取到可运行的 jar 中时,JDBC 运行良好,但在它们刚刚打包时运行良好【英文标题】:JDBC runs fine when libraries extracted into runnable jar, but not when they are just packaged 【发布时间】:2016-07-01 21:24:00 【问题描述】:

正如标题所说,当我将程序导出为可运行的 jar 并将引用的库提取到 jar 中时,我能够正常运行它并且 JDBC 能够连接到数据库。但是,当我使用简单打包的引用库导出它时,我收到错误“找不到适合 jdbc:mysql://localhost:3306 的驱动程序”。

此外,当我运行该程序时,它在 Eclipse 中运行良好。只有当我导出它时才会出现问题。由于该程序的实现方式,我无法将库提取到 jar 中。它们必须与它一起打包。

有什么想法吗?

【问题讨论】:

请解释一下“我无法将库提取到 jar 中。它们必须与它一起打包。”。 “在它旁边”是指“在包含我编写的代码的类的可运行 jar 之外”?如果是这样,那就是 Eclipse 导出(到可运行的 jar)对话框中的“复制”选项。 【参考方案1】:

不要将第三方库解压到您的 JAR 中。它违背了 JAR 的全部目的,即相互独立地打包库。这是一个非常非常糟糕的主意。

确切是什么意思?“将它与简单打包的引用库一起导出”?请列出所涉及的确切步骤,以便我们回答您的问题。当你“打包”你的应用程序时,你几乎肯定没有做正确的事情。由于我们不知道您做错了什么,我们无法提供帮助。

通常,您将库 JAR 放置在同一目录中或放置应用程序 JAR 的目录的受控子目录中。您可以使用应用程序 JAR 的清单在类路径中指定它们。阅读 JAR 文档了解如何执行所有这些操作。

您可以使用安装程序将您的 JAR 和所有依赖的 JAR 打包在一起,或者只需将它们一起放入您提取到部署目录中的 ZIP(或 JAR)文件中。不是在最外层的 ZIP 中,而是在您的实际应用程序 JAR 中,您将清单与类路径放在一起。

部署的目录结构是这样的:

application_directory/
  |
  |-- yourApplication.jar
  |
  |-- lib/
        |-- thirdParty.jar
        |-- anotherThirdParty.jar
        |-- someOther.jar
        |-- ...

请阅读 Oracle 文档中的 JAR 文件及其清单结构。 http://www.oracle.com/technetwork/java/javase/documentation/index.html

【讨论】:

以上是关于当库被提取到可运行的 jar 中时,JDBC 运行良好,但在它们刚刚打包时运行良好的主要内容,如果未能解决你的问题,请参考以下文章

如何将 oracle XE 数据库嵌入到可执行 jar 中?

为啥导出到可运行的 jar 会使应用占用这么多空间?

将 sqlite DB 添加到可执行 JAR 文件

包含 Eclipse 和可运行 Jar 的资源

在运行时添加 JDBC jar 时没有为 HSQL db 找到合适的 JDBC 驱动程序?

Scala 可运行 JAR 的 ProGuard 进程