Java 可以让JNI支持类路径中的通配符扩展吗?

Java 可以让JNI支持类路径中的通配符扩展吗?,java,c,unix,java-native-interface,classpath,Java,C,Unix,Java Native Interface,Classpath,我有一个通过JNI调用Java的C二进制文件。我将CLASSPATH设置为somedir/*以拾取somedir中的所有jar 当我运行二进制文件时,找不到所需的类定义。当我跑的时候 java that.class's.name 从同一命令行中,成功找到该类。如果我显式地将somedir/中的所有jar添加到类路径中,那么一切都很好,但这会导致我希望避免的非常长的类路径 通过JNI执行的JVM是否尊重类路径的通配符扩展?可以这样做吗?不,不可以。使用JNI没有帮助 这样做的方法是实现自己的类

我有一个通过JNI调用Java的C二进制文件。我将CLASSPATH设置为somedir/*以拾取somedir中的所有jar

当我运行二进制文件时,找不到所需的类定义。当我跑的时候

java that.class's.name 
从同一命令行中,成功找到该类。如果我显式地将somedir/中的所有jar添加到类路径中,那么一切都很好,但这会导致我希望避免的非常长的类路径


通过JNI执行的JVM是否尊重类路径的通配符扩展?可以这样做吗?

不,不可以。使用JNI没有帮助

这样做的方法是实现自己的类加载器(在Java中),但该类加载器必须位于无通配符的类路径中


当然,您可以在调用JVM之前将类路径设置为其扩展形式。这是可行的,可以通过一个shell脚本来完成(不需要JNI)。

我通过阅读hotspot源代码找到了答案

只有通过
CLASSPATH
-cp
/
-CLASSPATH
传递的路径才能进行通配符扩展。然后通过
-Djava.class.path
将它们作为系统属性传递给正在运行的JVM


您可以通过
JVMOptions
结构将类路径告知JNI调用的JVM,该结构可能包括
-Djava.class.path
,但
-classpath
不一定会得到尊重(实际上,热点实现并不尊重)。由于
java.class.path
是作为系统属性直接传递给JVM的,因此它不会得到通配符扩展,因此通配符不起作用

谢谢,还有关于类加载器的好建议。明确地说,使用JNI使通配符扩展变得不可能;否则,在Java>=1.5中,$CLASSPATH中的所有路径都将针对JAR进行扩展。