javac无法识别外部库

时间:2019-05-07 02:58:15

标签: javac lib

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

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

我已经使用了一些外部库(例如json-simple,gson等)。在编译过程中它们没有被认可。 但是,如果我运行类文件(来自Eclipse编译版本),它将得到正确执行

a)尝试从根文件夹进行编译(使用软件包名称) javac packageName.javaFileName.java b)进入包并直接编译。 javac javaFileName.java

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

1 个答案:

答案 0 :(得分:0)

  

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上为:,如图所示)。 / p>

如果外部库未打包到主jar中,则过程相同,但是查找所需的jar可能会遇到更大的挑战。另外,如果将这样的jar移到其他机器上,则可能无法运行。但是,您可能应该查看META_INF / MANIFEST.MF,因为它应该包含所需的信息。