【问题标题】:javac not recognizing external librariesjavac 无法识别外部库
【发布时间】:2019-05-07 02:58:14
【问题描述】:

我在 Eclipse 中有我的项目的工作版本。

我将项目导出为可运行的 jar。 提取(转换为 .zip 后)并尝试从命令提示符编译特定的 java 文件 (这样做是因为我有一个项目要求,该特定文件中的输入参数可以由不会有 Eclipse 的用户修改和重新编译/运行)

我使用了一些外部库(例如:json-simple、gson 等)。在编译期间它们没有被识别。 但是如果我运行类文件(来自 Eclipse 编译版本),它会正确执行

a)尝试从根目录编译(使用包名) javac packageName.javaFileName.java b)并进入包内部并直接编译。 javac javaFileName.java

a) 部分根本没有编译,说 classNotFound。 b) 部分开始编译,但在没有识别任何外部库的情况下抛出错误。(获取 --> 错误:在使用外部库的代码/导入的地方找不到符号)

【问题讨论】:

    标签: javac lib


    【解决方案1】:

    a)尝试从根文件夹编译(使用包名)javac packageName.javaFileName.java b) 进入包内部, 直接编译。 javac javaFileName.java

    a) 部分根本没有编译,说 classNotFound。

    是的。 javac 要求您指定要编译的(第一个)源的文件系统路径。相反,您似乎已将 .java 添加到所需的完全限定类名称的末尾。可能你想从解压后的 jar 根目录编译,指定正确的路径:

    javac [options] package/name/className.java
    

    对于类 package.name.className。 (如果您指定适当的选项,您也可以从不同的工作目录编译,如下所述。)

    b) 部分 开始编译但抛出一个错误,其中没有任何外部 库被识别。(获取->错误:找不到符号 使用外部库的代码/导入的地方)

    如果您正在编译的类依赖于其他也需要编译的类,那么javac 可能会对它们提出类似的投诉。从根目录编译(如 (a) 所示),或通过 -sourcepath 选项指定源根目录的路径。无论哪种方式,都没有理由进入源代码树进行编译。

    但外部库实际上是一个单独的问题,尽管是相关的。你不需要编译这些,但你需要告诉javac 将它们用作类的源。您可以通过-classpath 选项来实现,您可以将其缩写为-cp。如果这些被包装在罐子本身(即“胖罐子”)中,那么这应该相当容易,类似于以下内容:

    javac -cp .:lib/dependency1.jar:lib/dependency2.jar package/name/className.java
    

    “lib”部分可能会有所不同,分隔符肯定会因操作系统而异(在 Windows 上是 ;,而在 Mac / Linux / Solaris 上是 :,如图所示)。

    如果外部库没有打包到主 jar 中,那么过程是相同的,但您可能会面临更大的挑战来找到所需的 jar。此外,如果您将其移动到另一台机器上,这样的 jar 可能无法运行。不过,您可能应该查看 META_INF/MANIFEST.MF,因为它应该包含所需的信息。

    【讨论】:

      猜你喜欢
      • 2011-04-08
      • 2018-02-25
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多