我有一个
Lotus Notes数据库,正在执行与远程Web服务的一些交互.我编写了一个自定义Java类来执行交互.
>通过Lotus Notes Java代理程序调用的Java脚本库中
>位于用户的“jvm / lib / ext”目录下的JAR文件中
>位于用户的“jvm / lib”目录中的自定义目录中的JAR文件中(例如“jvm / lib / custom_dir”). Lotus Notes JVM通过使用“JavaUserClassesExt”本地notes.ini变量来了解自定义目录.
在我的类中,我只想返回当前类正在执行的位置.因此,如果从选项2或选项3执行,则返回JAR文件路径.如果从选项1执行,然后返回我可以处理的其他东西.
我已经尝试了以下内容.
getProtectionDomain()方法
getClass().getProtectionDomain().getCodeSource().getLocation()
其结果如下:
java.security.AccessControlException: Access denied (java.lang.RuntimePermission getProtectionDomain)
没有任何选项可以更改任何运行此安全设置的客户端的安全设置.
Class.getResource方法
String myName = "/" + getClass().getName().replace('.','/') + ".class"; URL myResourceURL = getClass().getResource(myName);
结果:myResourceURL是ALWAYS null.
ClassLoader.getResource方法
String myName2 = getClass().getName().replace('.','/') + ".class"; ClassLoader myCL = getClass().getClassLoader(); URL myResourceURL2 = myCL.getResource(myName);
结果:myResourceURL2是ALWAYS null.
a)我上面哪里出错了?
和
解决方法
我已经设法通过将我的代码包装在“AccessController.doPrivileged”块中,从而克服了这一点,即:
final String[] myLocationViaProtectionDomain = {null}; AccessController.doPrivileged(new PrivilegedAction(){ public Object run(){ myLocationViaProtectionDomain[0] = getClass().getProtectionDomain().getCodeSource().getLocation().toString(); debug("myLocationViaProtectionDomain: " + myLocationViaProtectionDomain[0]); return null; } });
有趣的是,当JAR文件位于客户端的JVM目录(即我的原始帖子中的第2点和第3点)时,这种方法与我想要的一样正常.但是,当从Java脚本库中执行代码时运行相同的代码时,会抛出以下异常:
java.security.AccessControlException: Access denied (java.lang.RuntimePermission getProtectionDomain)
这是很好的,因为至少在1和(2和3)之间有区别,我可以正确处理.
这个解决方案是由lekkimworld.com的优秀Mikkel(Twitter:@lekkim)向我指出的,所以非常感谢他出面.