2012-07-13 68 views
2

我的代码编译使用以下命令罚款:类路径 - 在命令行中运行Java程序

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

(LIB是我把我的jar文件)

在运行时,我得到

DatumReader<?> dtmrdr = new GenericDatumReader();

它说,它无法找到:上以下行ClassNotFoundException即使我已经导入它,也是。

为什么会发生这种情况?

谢谢!

+1

你是如何运行该程序的?在运行应用程序时,您还必须为类路径提供所有的依赖关系。 – birryree 2012-07-13 00:03:28

+0

我运行它通过运行 'Java Generator' 。 Generator是一个在AvroReader.java中调用方法的类 – 2012-07-13 00:19:21

回答

8

导入具有

java -cp "lib directory where i put all the jars" MainClassOfYourApplication 

后您编译它与加载类或设置CLASSPATH无关。

试试这个:

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

使用点'.'作为CLASSPATH中的第一项假定Generator.class文件中要从中运行Java的目录存在,并且/lib是一个级别从最高目录。如果两者都不正确,则根据需要进行调整。

+0

我不确定我是否理解“使用。作为CLASSPATH中的第一项”是什么意思 – 2012-07-13 00:39:00

+0

请仔细查看我发布的编译字符串。看到分号前的点?这是您错过的步骤,导致JVM无法找到您的Generator.class。 – duffymo 2012-07-13 00:56:17

+0

@DaoLam - '-cp'之后的参数是类路径。它是由';'字符分隔的目录列表。第一项是“。”,意思是“当前目录”。第二项是'../ lib/*',意思是'../ lib'目录中的所有内容。 Duffymo告诉你,你需要将'current directory'(Generator.class的位置)包含到你的类路径中。 – jahroy 2012-07-13 01:54:09

5

您应该再次运行,包括相同的CP方案:

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 
+0

您不能只使用jar目录;你需要一个通配符。目录类路径条目仅用于类文件,AFAIK - 指向文档的指针否则会有帮助。我正在查看[1.7类路径文档](http://docs.oracle.com/javase/7/docs/technotes/tools/windows/classpath.html)。 – 2012-07-13 00:13:11

+1

我在另一个类中调用AvroReader的方法。这是我如何运行它: '的javac -cp “JAR目录” AvroReader.java' '的javac Generator.java' 'Java的Generator' 我想你建议java命令 “JAR目录” 发电机,但现在它说它找不到Generator。 – 2012-07-13 00:13:23

+0

@Dave Newton:是的,我实际上有一个通配符。它基本上就像是“../lib/*” 对不起,我原来的帖子并不清楚。 – 2012-07-13 00:18:06