【问题标题】:How to compile Java program with .jar library如何使用 .jar 库编译 Java 程序
【发布时间】:2011-08-29 07:18:39
【问题描述】:

我无法让 javac 识别外部 .jar 文件,我正在尝试扩展其类。我在同一个目录中有两个文件:TestConsole.java 和 acm.jar。我正在使用以下命令从同一目录编译:

javac -classpath .:acm.jar TestConsole.java

但似乎 javac 只是忽略了 acm.jar。它给了我错误:

TestConsole.java:1: package acm does not exist
import acm.program;
          ^

当然,acm.program 是 acm.jar 中的一个包。 acm.jar 中的所有类都已编译;我只想在我的类中使用它们,而不是编译它们。

我做错了什么?

我在 Mac 上运行它,acm.jar 的目录结构似乎是有效的:它包含一个 acm/program 目录,其中包含 ConsoleProgram.class,这是 TestConsole 扩展的唯一类。

javac -classpath ".:acm.jar" TestConsole.java 也不起作用。

【问题讨论】:

  • 您正在导入 acm.program... 您说的是一个包...不是一个类。要从 acm.program 包中导入一个类,您必须执行 'import acm.program.CLASS',以导入单个类,或者您必须使用 'import 导入包中的所有类acm.program.* ;'

标签: java compiler-construction


【解决方案1】:

您是否在 Windows 机器上运行这些命令?在 Windows 上,类路径的元素由分号而不是冒号分隔。所以:

javac -classpath .;acm.jar TestConsole.java

另一种可能:acm.jar 的结构是错误的。仅从声明 package acm.program 的文件编译内部的类文件是不够的 - 包结构还必须表示为目录层次结构,因此 acm.jar 必须包含目录 acm,并且其中包含子目录 program包含TestConsole 中使用的类的实际类文件。

【讨论】:

  • 结构似乎是正确的(我解压缩它以检查),并且我在 Mac 上运行它。
  • @Steve-o 在 Unix 上,您不会使用分号,因为路径分隔符是冒号。
【解决方案2】:
javac -cp <jar you want to include>;<jar you want to include> <source.java> 

&lt;jar you want to include&gt;如果在同一个目录,只要jar的名字就行,如果不是,指定完整或相对路径

如果超过一个罐子,用,分隔

在unix 上将; 替换为:

如果可能,请使用 Eclipse 之类的 IDE。我过去常常在类似的事情上花费大量时间,但在工业领域,你几乎不会以这种方式去做。

【讨论】:

  • 我不想运行任何东西;我的源代码无法通过编译器,因为它从 jar 文件中扩展了一个类。
  • 他正在编译,这个命令是用来运行编译好的源码
  • 这也没有用。通常,我会使用 Eclipse,但现在不可行。我只想在这台机器上编译一个东西!
【解决方案3】:

检查清单:

  1. 您在 acm.jar 中的类显示为:

    acm/program/CLASSX.class

    acm/program/CLASSY.class

    当用 jar tf acm.jar 倾析时

  2. 您正在像这样导入它们:

导入 acm.program.CLASSX ;

或

导入 acm.program.* ;

【讨论】:

  • 啊!进口声明是acm.program;!应该是acm.program.*;。
【解决方案4】:

我只是为编译成功后仍在寻找相同问题答案的人添加。

编译时使用@Michael Borgwardt 上面建议的命令:

javac -classpath .;acm.jar TestConsole.java

为了执行还需要指定类路径:

java -classpath .;acm.jar TestConsole

【讨论】:

    【解决方案5】:

    无论谁尝试编译,但在我挣扎了几个小时后仍然遇到问题,我尝试了上面所有的答案,但由于一个小问题仍然无法运行程序。

    最简单的问题是每个包裹后的分号。我不确定 Mac 或 Linux,但对于 Windows 命令提示符,情况就是这样

    javac -cp mysql-connector-java-8.0.12.jar; Testing.java

    java -cp mysql-connector-java-8.0.12.jar; Testing

    您可能希望在编译或运行时都遵循这两种情况。

    【讨论】:

      【解决方案6】:

      落后很多年,但我一直在努力使用这种语法,这对我来说很有效,可以将所有 jar 文件以及将程序中的所有类编译到主类中

      我的文件树: 存储类 .java 文件 jar .jar 文件
      图片 .PNG 文件

      命令行:

      C:\Store>javac -cp "jars/" classes/.java classes/storeMain.java

      【讨论】:

      • 应该是“jars/*”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多