[英]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.