在执行jar时获取ClassNotFound异常

时间:2013-08-09 18:52:57

标签: java intellij-idea

  • 使用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中
  • 有什么想法吗?

1 个答案:

答案 0 :(得分:0)

可执行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 <MainClass goes here>(假设两个罐子在正确的位置。

关于不能做你想做的事情(以及许多其他人多年来想要做的事情)的一般挫折感有一些讨论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 ...
    }
}

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

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

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