6

我的代码使用以下命令编译得很好:

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

(lib 是我放置 jar 文件的地方)

在运行时,我得到ClassNotFoundException以下行:

DatumReader<?> dtmrdr = new GenericDatumReader();

org.apache.avro.generic.GenericDatumReader它说即使我已经导入它也找不到。

为什么会这样?

4

3 回答 3

14

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

试试这个:

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

使用点'.'作为 CLASSPATH 中的第一个条目假定该Generator.class文件存在于您运行 java 的目录中,并且/lib比该目录高一级。如果这两个都不正确,请根据需要进行调整。

于 2012-07-13T00:24:13.060 回答
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
于 2012-07-13T00:06:42.697 回答
-1

使用外部 jar 文件在 Linux 系统上编译和执行 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

使用外部 jar 文件在 Windows 系统上编译和执行 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

在 Linux 的 Unix 中,Java Classpath 包含用冒号“:”分隔的目录名称,在 Windows 上 Java Classpath 将是分号“;” 如果您在 Manifest 文件中定义了 java 类路径,则这些将是空格分隔的。

有关 Classpath 的更多知识,请访问https://javarevisited.blogspot.com/2011/01/how-classpath-work-in-java.html

于 2020-08-21T08:04:32.793 回答