我在Eclipse中有我的项目的工作版本。
我将项目导出为可运行的jar。 提取(转换为.zip后)并尝试从命令提示符下编译特定的Java文件 (这样做是因为我有一个项目需求,该文件中的输入参数可以由不具备Eclipse的用户修改和重新编译/运行)
我已经使用了一些外部库(例如json-simple,gson等)。在编译过程中它们没有被认可。 但是,如果我运行类文件(来自Eclipse编译版本),它将得到正确执行
a)尝试从根文件夹进行编译(使用软件包名称) javac packageName.javaFileName.java b)进入包并直接编译。 javac javaFileName.java
a)部分根本没有编译为classNotFound。 b)部分开始编译,但在未识别出任何外部库的情况下引发了一个错误。(获取->错误:在使用外部lib的代码/导入的地方都找不到符号)
答案 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,因为它应该包含所需的信息。