类路径 - 如何从命令行运行Java程序

6

使用以下命令,我的代码编译通过:

javac -cp "../lib/*" AvroReader.java

(lib是我放置jar文件的位置)

在运行时,以下行出现了ClassNotFoundException:

DatumReader<?> dtmrdr = new GenericDatumReader();

尽管已导入,它仍然提示找不到org.apache.avro.generic.GenericDatumReader

为什么会发生这种情况?


1
你是怎样运行这个程序的?当你运行应用程序时,必须同时提供包含所有依赖项的类路径。 - wkl
我通过运行java Generator命令来执行它。 Generator是一个类,它调用了AvroReader.java中的一个方法。 - Dao Lam
3个回答

15

导入与加载类或设置CLASSPATH无关。

请尝试这样做:

java -cp .;../lib/* Generator

在CLASSPATH的第一个条目使用点号'.',假定Generator.class文件存在于运行Java的目录中,并且/lib在该目录的上一级目录。如果这些都不正确,请进行调整。


请仔细查看我发布的编译字符串。看到分号前面的点了吗?这就是你错过的步骤,导致JVM找不到你的Generator.class文件。 - duffymo
1
@duffymo:你不必如此严厉和泼冷水。我来这里的事实表明我还不是Java专家,我仍在学习。阅读jahroy的评论后,我意识到了它的含义,并且之前就已经知道了。可能是我发表那条评论时脑子死了。 - Dao Lam
谢谢。虽然它能工作,但有些地方我不理解。在看了其他帖子后(在你发布你的帖子之前),我将当前目录添加到类路径中(应该与“。”相同),但它没有起作用。为什么呢? - Dao Lam
在Mac OS上,文件分隔符是冒号(:),需要用引号括起来。因此,执行java -cp .:"../lib/*" Generator命令。 - Net Dawg
是的。五年前我回答这个问题时,似乎没有人在意这个缺失的细节。在这里写这样的评论肯定有更好的时间利用方式。 - duffymo
显示剩余2条评论

8
你应该再次运行包含相同cp的程序:
java -cp "lib directory where i put all the jars" MainClassOfYourApplication

在你使用以下命令编译后:

javac -cp "lib directory where i put all the jars" AvroReader.java

更加贴切您的例子:
First step(compile all the needed java files): javac -cp "path/to/jars/*" AvroReader.java //here you should include all the java files not yet compiled but which you need to run your app
Second step: java -cp "path/to/jars/*" package.subpackage1.subpackage2.Generator

你不能仅使用jar目录,你需要一个通配符。据我所知,目录类路径条目仅用于类文件,指向说明文档的指针将会很有帮助。我正在查看1.7类路径文档 - Dave Newton
1
我正在另一个类中从AvroReader调用一个方法。这是我的运行方式:`javac -cp "jar directory" AvroReader.java` `javac Generator.java` `java Generator`我尝试了你建议的java -cp "jar directory" Generator,但现在它说找不到Generator。 - Dao Lam
@Dave Newton:是的,我实际上有一个通配符。它基本上是类似于“../lib/*”的东西。 抱歉我在原帖中没有表达清楚。 - Dao Lam
@DaoLam - 如果你只是调用 java Generator,它不会工作,因为你没有指定类路径。然而,你的评论似乎与你的问题中的信息相矛盾... - jahroy
@jahroy 你能详细说明如何运行它吗?谢谢! :) - Dao Lam
@DaoLam - 读这个答案,它告诉你该怎么做:当你运行程序时,需要包含类路径 编译它时也需要。 - jahroy

-1
在Linux系统上编译并执行带有外部JAR文件的Java文件:
javac -cp jar_file1.jar:jar_file2:jar_file3.jar:. java_program_name.java

java -cp new_mail_api.jar:activation.jar:additional.jar:.java_program_name

在Windows系统上编译和执行带有外部jar文件的Java文件:

javac -cp jar_file1.jar;jar_file2;jar_file3.jar;. java_program_name.java

java -cp new_mail_api.jar;activation.jar;additional.jar;.java_program_name

在Unix或Linux中,Java的Classpath包含以冒号“:”分隔的目录名称。而在Windows上,Java的Classpath将用分号“;”分隔。如果您在清单文件中定义了Java的classpath,则这些将用空格分隔。
要了解更多关于Classpath的知识,请访问https://javarevisited.blogspot.com/2011/01/how-classpath-work-in-java.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接