我的代码使用以下命令编译得很好:
javac -cp "../lib/*" AvroReader.java
(lib 是我放置 jar 文件的地方)
在运行时,我得到ClassNotFoundException
以下行:
DatumReader<?> dtmrdr = new GenericDatumReader();
org.apache.avro.generic.GenericDatumReader
它说即使我已经导入它也找不到。
为什么会这样?
我的代码使用以下命令编译得很好:
javac -cp "../lib/*" AvroReader.java
(lib 是我放置 jar 文件的地方)
在运行时,我得到ClassNotFoundException
以下行:
DatumReader<?> dtmrdr = new GenericDatumReader();
org.apache.avro.generic.GenericDatumReader
它说即使我已经导入它也找不到。
为什么会这样?
导入与加载类或设置 CLASSPATH 无关。
试试这个:
java -cp .;../lib/* Generator
使用点'.'
作为 CLASSPATH 中的第一个条目假定该Generator.class
文件存在于您运行 java 的目录中,并且/lib
比该目录高一级。如果这两个都不正确,请根据需要进行调整。
您应该再次运行包含相同 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 文件在 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