【问题标题】:How correctly compile a Java class using a classpath?如何使用类路径正确编译 Java 类?
【发布时间】:2015-02-12 12:57:57
【问题描述】:

我有一个使用外部 .jar 库的 Java Main 类。

所以我正在尝试编译它,将这个 .jar 文件放入类路径中:

C:\Projects\edi-sta\src>javac -cp ojdbc6.jar:. Main.java

所以我认为我必须编译 Main.Java 类“导入”由 ojdbc6.jar 表示的类路径。

它没有给我任何错误消息并编译它,但问题是当我尝试执行编译后的 Main 类时,我收到以下错误消息:

C:\Projects\edi-sta\src>java Main
Hello World !!!
0
java.lang.ClassNotFoundException: oracle.jdbc.OracleDriver
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Unknown Source)
        at Main.main(Main.java:21)

C:\Projects\edi-sta\src>

它看不到在编译时用作类路径的 ojdbc6.jar 中定义的 oracle.jdbc.OracleDriver 类。

为什么我有这个问题?我错过了什么?我该如何解决?

编辑 1:

我将我的 Main.java 类移动到一个名为 ma​​inPkg 的包中。

所以我有以下情况我也放了ojdbc6.jar文件:

C:\Projects\edi-sta\src\mainPkg>dir
 Il volume nell'unità C è OS
 Numero di serie del volume: 9414-E1F8

 Directory di C:\Projects\edi-sta\src\mainPkg

12/02/2015  14:18    <DIR>          .
12/02/2015  14:18    <DIR>          ..
12/02/2015  14:13             1.337 Main.class
12/02/2015  14:05             1.285 Main.java
11/02/2015  11:01         3.692.096 ojdbc6.jar
               3 File      3.694.718 byte
               2 Directory   4.861.566.976 byte disponibili

Main.class 文件是通过执行以下命令创建的:

javac -cp ojdbc6.jar;. Main.java

我在这里也使用了 ; 分隔符,因为我在 Windows 下。

现在我已经创建了 Main.class 文件,我尝试执行此操作:

java -cp ojdbc6.jar;. Main

但我仍然收到“无法找到或加载主类”错误消息:

C:\Projects\edi-sta\src\mainPkg>javac -cp ojdbc6.jar;. Main.java

C:\Projects\edi-sta\src\mainPkg>java -cp ojdbc6.jar;. Main
Errore: impossibile trovare o caricare la classe principale Main

C:\Projects\edi-sta\src\mainPkg>

我错过了什么?怎么了?

Tnx

【问题讨论】:

    标签: java jakarta-ee classpath javac


    【解决方案1】:

    您还需要运行时类路径中的 jar:

    java -cp ojdbc6.jar:. Main
    

    否则,很明显,JVM 无法从 jar 文件中加载类:它会在哪里找到它们?

    请注意,您永远不应使用默认包。养成为所有类定义包的好习惯。

    【讨论】:

    • 我试着按照你的解释去做,但现在我得到了“无法找到或加载主类”。可能是什么问题?
    • 您使用的是 Windows 还是 Linux?当前目录的内容是什么(即在 Linux 上执行 ls 或在 Windows 上执行 dir 时列出的内容)?
    • 我使用的是 Windows。该目录包含 Main.class、Main.java 和 ojdbc6.jar 文件
    • 在 Windows 上,分隔符是 ;,而不是 :。所以命令是java -cp ojdbc6.jar;. Main
    • 你的班级在包mainPkg吗?如果是这样,您应该从src 目录编译和运行。编译:javac -cp mainPkg\ojdbc6.jar mainPkg\Main.java。运行:java -cp mainPkg\ojdbc6.jar;. mainPkg.Main。但是 jar 文件不应该在源目录中。您应该使用-d 选项为类文件指定当前目录以外的目录。类路径必须包含构成包树根的 jar 文件和目录。
    【解决方案2】:

    您在运行时也需要 CLASSPATH 中的外部 JAR。运行时添加相同的 -cp 参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多