【问题标题】:Getting ClassNotFound Exception when executing jar执行jar时出现ClassNotFound异常
【发布时间】:2013-08-09 18:52:57
【问题描述】:
  • 我正在使用 IntelliJ 12.0.4 社区版。
  • 我创建了一个名为 DB 的 Java 控制台应用程序,主类名称为 DB。
  • 我将它打包成一个名为 DB.jar 的可执行 jar 文件。
  • 在该应用程序中,我使用 JDBC 连接到 Oracle DB。
  • 我通过 Intellij 的项目结构(模块、库)将必要的 JDBC jar 文件打包到 DB.jar 中

  • 当我在 IntelliJ 中执行应用程序时,它会成功运行

  • 如果我将 DB.jar 复制到某个目录并通过“java -jar DB.jar”执行它,我会在 oracle.jdbc.driver.OracleDriver 上收到 ClassNotFound 异常
  • 我查看了 DB.jar,jdbc jar 文件(ojdbc6.jar、ojdbc14.jar)在 DB.jar 中
  • 有什么想法吗?

【问题讨论】:

    标签: java intellij-idea


    【解决方案1】:

    可执行 jar 中的 jar 通常不在类路径中。

    您可以将它们放在与 DB.jar 相同的文件夹中并执行以下操作:

    java -cp DB.jar;ojdbc6.jar;ojdbc14.jar <MainClass goes here>
    

    应该运行它。

    您还可以将 Class-Path 条目放在 jar 内的 Manifest.MF 文件中,以引用相对于计算机文件系统中 DB.jar 位置的其他 jar。引用另外两个jar文件,然后就可以java -jar DB.jar &lt;MainClass goes here&gt;了(假设两个jar在正确的位置。

    有一些讨论 here 关于无法做你想做的事(以及许多其他人多年来一直想做的事)的普遍挫败感。

    Classpath including JAR within a JAR

    说明主类

    当您从命令行运行 java 应用程序时,会从某个类开始执行。它看起来像这样:

    package com.mycompany.app;
    
    public class StartHere {
    
        public static void main(String[] args) {
            // Your code goes here ...
        }
    }
    

    如果此示例是您的应用程序启动的类,您将使用命令行 this 来启动它。这假设您在类路径的 jar 中的正确包位置中有 StartHere 类:

    java -cp DB.jar;ojdbc6.jar;ojdbc14.jar com.mycompany.app.StartHere
    

    请注意,这允许您在同一个 jar 中拥有多个应用程序。只需使用main() 方法创建多个类,然后使用命令行上显示的不同起始类运行它们。

    【讨论】:

    • 我是否需要明确设置我的类路径以指向它们?似乎这就是把它们放进罐子里的意义所在。
    • 是的。这不是问题。
    • 谢谢,我试试看。那么将罐子捆绑到我的罐子里对我有什么好处吗?
    • 如果你眯着眼睛真的很努力,你会发现你已经在你的 jar 中存储了这些 jar 的正确版本,并且将来可以提取它们并将它们放在文件夹中运行。您也需要 jar 中的“自述文件”来解释这一点。
    • 我把 jdbc jar 放在我的 jar 的目录中,转到那个目录,执行 java -cp ojdbc6.jar;ojdbc14.jar -jar DB.jar 仍然得到同样的错误 (grrr)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    • 2011-07-07
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    相关资源
    最近更新 更多