简体   繁体   English

为什么CLASSPATH带有JDK路径前缀?

[英]Why is CLASSPATH prefixed with JDK path?

While trying to build a library that uses javah, I ran into a classpath issue. 尝试构建使用javah的库时,遇到了类路径问题。 Apparently, the classpath is prefixed with the JDK path: please notice the final search path is wrong . 显然,类路径以JDK路径为前缀:请注意,最终搜索路径是错误 How should I do instead? 我该怎么办呢?

elmarco@makai:~/src/sasl/java/CyrusSasl (mingw32 *%)$ CLASSPATH=$PWD javah -o javasasl.h -jni -verbose Sasl 
error: cannot access Sasl
class file for Sasl not found
javadoc: error - Class Sasl not found.
[ Search Path: /usr/java/jdk1.6.0_24/jre/lib/resources.jar:/usr/java/jdk1.6.0_24/jre/lib/rt.jar:/usr/java/jdk1.6.0_24/jre/lib/sunrsasign.jar:/usr/java/jdk1.6.0_24/jre/lib/jsse.jar:/usr/java/jdk1.6.0_24/jre/lib/jce.jar:/usr/java/jdk1.6.0_24/jre/lib/charsets.jar:/usr/java/jdk1.6.0_24/jre/lib/modules/jdk.boot.jar:/usr/java/jdk1.6.0_24/jre/classes//home/elmarco/src/sasl/java/CyrusSasl ]
elmarco@makai:~/src/sasl/java/CyrusSasl (mingw32 *%)$ ls Sasl.java 
Sasl.java

Thanks for your help! 谢谢你的帮助!

(this is jdk1.6.0_24 on Fedora 14) (这是Fedora 14上的jdk1.6.0_24)

I usually avoid the CLASSPATH environment variable. 我通常避免使用CLASSPATH环境变量。 This should work (and maybe without a problem): 这应该工作(也许没有问题):

javah -classpath .;<your-path> -o javasasl.h -jni -verbose Sasl

If don't need nothing but the local path, then you don't have to specify a -classpath option, . 如果只需要本地路径,则无需指定-classpath选项. is the default value. 是默认值。

Note - you have to compile Sasl.java first. 注意 -您必须先编译 Sasl.java javah expects a class file. javah需要一个类文件。 (Getting started) (入门)

I think it's simply a bug in how the javah outputs its actual classpath. 我认为这只是javah如何输出其实际类路径的错误。 What happens is that it has a bunch of places where it searches for built-in classes, and apart from them, it also uses the stuff in $CLASSPATH . 发生的事情是,它在很多地方搜索内置类,除此以外,它还使用$CLASSPATH的东西。 When it prints the actual classpath used, they do something like this (pseudo code, assuming implicitEntries is a list of builtin classpath entries, and explicitEntries is a list of the the directories specified in $CLASSPATH ): 当它打印使用的实际类路径时,它们会执行以下操作(伪代码,假设implicitEntries是内置类路径条目的列表,而explicitEntries$CLASSPATH指定的目录的列表):

print implicitEntries.join(pathSeparator) + explicitEntries.join(pathSeparator)

where it should have been 应该在哪里

print implicitEntries.join(pathSeparator) + pathSeparator + explicitEntries.join(pathSeparator)

The following works fine for me: 以下对我有用:

$ ls
Sasl.class  Sasl.java
$ javah -classpath . -o javasasl.h -jni -verbose Sasl     [ Search Path: /usr/java/jdk1.6.0/jre/lib/resources.jar:/usr/java/jdk1.6.0/jre/lib/rt.jar:/usr/java/jdk1.6.0/jre/lib/sunrsasign.jar:/usr/java/jdk1.6.0/jre/lib/jsse.jar:/usr/java/jdk1.6.0/jre/lib/jce.jar:/usr/java/jdk1.6.0/jre/lib/charsets.jar:/usr/java/jdk1.6.0/jre/classes/. ]
[Creating file javasasl.h]
[search path for source files: [.]]
[search path for class files: [/usr/java/jdk1.6.0/jre/lib/resources.jar, /usr/java/jdk1.6.0/jre/lib/rt.jar, /usr/java/jdk1.6.0/jre/lib/sunrsasign.jar, /usr/java/jdk1.6.0/jre/lib/jsse.jar, /usr/java/jdk1.6.0/jre/lib/jce.jar, /usr/java/jdk1.6.0/jre/lib/charsets.jar, /usr/java/jdk1.6.0/jre/classes, /usr/java/jdk1.6.0/jre/lib/ext/dnsns.jar, /usr/java/jdk1.6.0/jre/lib/ext/localedata.jar, /usr/java/jdk1.6.0/jre/lib/ext/sunpkcs11.jar, /usr/java/jdk1.6.0/jre/lib/ext/sunjce_provider.jar, .]]
[loading ./Sasl.class]
[loading /usr/java/jdk1.6.0/lib/ct.sym(META-INF/sym/rt.jar/java/lang/Object.class)]
[loading /usr/java/jdk1.6.0/lib/ct.sym(META-INF/sym/rt.jar/java/lang/Throwable.class)]
[loading /usr/java/jdk1.6.0/lib/ct.sym(META-INF/sym/rt.jar/java/lang/Class.class)]
[done in 585 ms]
$ ls
javasasl.h  Sasl.class  Sasl.java

Now, since the header file generation doesn't seem to work for you... are you sure you have Sasl.class in the current directory? 现在,由于头文件生成似乎不适用于您...您确定当前目录中有Sasl.class吗? javah works with byte code files, not Java source files. javah适用于字节码文件,而不适用于Java源文件。

You show here, that the source file is available ... 您在此处显示源文件可用...

(mingw32 *%)$ ls Sasl.java 
Sasl.java

but missing is the class file (Sasl.class). 但缺少的是类文件(Sasl.class)。

error: cannot access Sasl
class file for Sasl not found

Compile it first. 首先编译它。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM