Почему CLASSPATH имеет префикс JDK? - PullRequest
0 голосов
/ 24 марта 2011

При попытке создать библиотеку, использующую javah, я столкнулся с проблемой пути к классам.Очевидно, путь к классу имеет префикс с путем JDK: пожалуйста, обратите внимание , окончательный путь поиска неправильный .Как мне сделать вместо этого?

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

Спасибо за вашу помощь!

(это jdk1.6.0_24 в Fedora 14)

Ответы [ 3 ]

1 голос
/ 24 марта 2011

Я думаю, это просто ошибка в том, как javah выводит фактический путь к классу.Что происходит, так это то, что у него есть куча мест, где он ищет встроенные классы, и кроме них он также использует материал из $CLASSPATH.Когда он печатает фактический используемый classpath, они делают что-то вроде этого (псевдокод, предполагая, что implicitEntries - это список встроенных записей classpath, а explicitEntries - список каталогов, указанных в $CLASSPATH):

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

там, где это должно было быть

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

У меня отлично работает следующее:

$ 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

Теперь, поскольку генерация файла заголовка не выглядитработать на вас ... вы уверены, что у вас есть Sasl.class в текущем каталоге?javah работает с файлами байт-кода, а не с исходными файлами Java.

1 голос
/ 24 марта 2011

Вы показываете здесь, что исходный файл доступен ...

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

но отсутствует файл класса (Sasl.class).

error: cannot access Sasl
class file for Sasl not found

Сначала скомпилируйте.

1 голос
/ 24 марта 2011

Я обычно избегаю переменной окружения CLASSPATH. Это должно работать (и, возможно, без проблем):

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

Если вам ничего не нужно, кроме локального пути, вам не нужно указывать опцию -classpath, . является значением по умолчанию.

Примечание - сначала нужно скомпилировать Sasl.java. javah ожидает файл класса. (Начало работы)

...