0
  • 我正在使用 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 中
  • 有什么想法吗?
4

1 回答 1

0

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

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

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

那应该运行它。

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

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

在 JAR 中包含 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()方法创建多个类,并使用命令行上显示的不同起始类运行它们。

于 2013-08-09T18:54:25.400 回答