Можно ли сделать JNI для расширения подстановочных знаков в пути к классам? - PullRequest
6 голосов
/ 17 февраля 2012

У меня есть двоичный файл C, который обращается к Java через JNI.Я устанавливаю CLASSPATH в somedir / *, чтобы забрать все фляги в somedir.

Когда я запускаю двоичный файл, требуемое определение класса не может быть найдено.Когда я запускаю

java that.class's.name 

из той же командной строки, класс успешно найден.Если я явно добавлю все jar-файлы из somedir / в classpath, все будет отлично работать, но это приведет к очень длинному пути к классам, которого я хотел бы избежать.

Соблюдает ли JVM, выполняемая через JNI, расширение подстановочного знака classpath?Можно ли это сделать для этого?

Ответы [ 2 ]

7 голосов
/ 17 февраля 2012

Я понял ответ, прочитав исходный код горячей точки.

Только пути, пройденные через CLASSPATH или -cp / -classpath, подлежат расширению с использованием подстановочных знаков.Затем они передаются в качестве системного свойства работающей JVM через -Djava.class.path.

. Вы сообщаете JVI-вызываемой JVM о пути к классам через структуру JVMOptions, которая может включать -Djava.class.path, но -classpath не обязательно не будет соблюдаться (и на практике это не реализовано в горячей точке).Поскольку java.class.path напрямую передается в JVM как системное свойство, он не раскрывается по шаблону и поэтому не будет работать с символами подстановки.

3 голосов
/ 17 февраля 2012

Нет.Нет, не может.Использование JNI не помогает.

Способ, которым вы могли бы сделать это, - реализовать собственный загрузчик классов (в Java), но этот загрузчик классов должен быть в CLASSPATH без подстановочных знаков.1004 * Конечно, вы можете установить CLASSPATH в расширенную форму до , вызывающего JVM.Это будет работать и может быть сделано с помощью сценария оболочки (JNI не требуется).

...