java – 当前运行的类或JAR文件的位置

前端之家收集整理的这篇文章主要介绍了java – 当前运行的类或JAR文件的位置前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个 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)我上面哪里出错了?

b)如何使用不同的方法获取当前正在执行的类的位置?

解决方法

我已经设法通过将我的代码包装在“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)向我指出的,所以非常感谢他出面.

原文链接:https://www.f2er.com/java/122591.html

猜你在找的Java相关文章