【问题标题】:One Jar requires another Jar一个罐子需要另一个罐子
【发布时间】:2012-12-28 19:12:13
【问题描述】:

我创建了一个将连接到 oracle 数据库的类,它具有三个简单的函数connect()executeStatement()disconnect()。这个类需要一个 oracle “瘦” JDBC Jar 才能工作,因此它是“引用库”的一部分。

我现在要做的是将上面提到的类导出为 JAR 文件,以便其他程序可以使用它。但是,当我尝试这样做时,我会遇到以下问题。

Exception in thread "main" java.lang.NoClassDefFoundError: oracle/jdbc/driver/OracleDriver
Caused by: java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver

我可以使用什么方法来制作它,以便 MY Jar 文件与 oracle Jar 文件一起使用?

【问题讨论】:

  • 宁可使用依赖管理系统,例如 Maven。然后,您的库的用户将在使用 Maven 构建他们的系统时获得依赖项。

标签: java jar


【解决方案1】:

为了从多个 jar 中加载类,java 使用所谓的 classpath。 这是一个 jar 列表,也是与 jar 内容结构相同的目录。

此列表由java 的参数定义,位于-cp 之后。 请参阅文档,例如在这里。

java -cp jar1.jar;jar2.jar com.my.Class

java -cp jar1.jar;jar2.jar -jar main.jar

另外,你可以研究一下 MANIFEST.MF,它可以列出它的依赖 jars。

【讨论】:

  • Ondra 你能再具体点吗?这段代码是否要放在某个文件中?这是命令行的东西吗?你的语法等价物是什么,jar1、jar2 main.jar 或 com.my.Class 是什么意思?
【解决方案2】:

您必须将程序(包括您的代码)所需的所有 jar 添加到类路径中。例如:

java -cp jar1.jar;jar2.jar com.my.Class

类路径定义了 JVM 在加载代码时将在何处查找代码。这是一个关于从命令行运行 Java 程序的快速而简单的教程:

http://www.sergiy.ca/how-to-compile-and-launch-java-code-from-command-line/

【讨论】:

  • 是的,但我添加了一个解释为什么它有效。这是我对@Ondra 提供的内容的对话的贡献,所以我觉得你把它打倒有点苛刻。
  • 我很欣赏门把手的解释。不幸的是,我想要求更多的澄清。您能否将我链接到资源或提供有关这行代码的详细信息以及语法的含义?我可以弄清楚大部分但不理解“com.my.Class”
  • 这不是 Java 代码。这是您将用于在命令行上运行 JVM(即 java)的命令。这在某种程度上取决于操作系统,因为您在命令行上执行命令的方式因操作系统而异。但是这个命令的意思是执行java(第一个词),将以下jar添加到类路径(-cp jar1.jar;jar2.jar)并在完全限定类(com.my.Class)中执行main()方法)。这是 public static void main(String[] args) 方法所在的 Java 类的名称。 com.my 是类所在的包。
  • 您可以从终端应用程序(如 Windows 上的 cmd 或 Mac OS 或 Linux 上的终端)执行此操作。您可能想在 Internet 上找到一些关于执行 Java 代码的教程,因为它们可以为您提供比这样的 SO 主题更多的信息。
【解决方案3】:

看看这个答案:Is it possible to create an "uber" jar containing the project classes and the project dependencies as jars with a custom manifest file?

您也可以在 Google 上搜索“uberjar”。这描述了如何创建一个包含所有嵌入类的 jar。

你仍然可以使用类路径:

java -cp jar1.jar;jar2.jar com.my.Class

【讨论】:

    【解决方案4】:

    如果你的意思是你希望你的 jar 文件完全独立并且没有暴露给客户端代码的依赖项,那么你可以尝试Jar Jar Links,它将重命名依赖项并将它们包含在你的 jar 中。

    similar question的答案中提到了其他可能性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-03
      • 2013-06-19
      • 1970-01-01
      • 2011-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-19
      相关资源
      最近更新 更多