加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 05:26:16 所属栏目:Java 来源:网络整理
导读:我有一个 Lotus Notes数据库,正在执行与远程Web服务的一些交互.我编写了一个自定义Java类来执行交互. 根据用户的设置,类方法可以从三个位置之一执行: 通过Lotus Notes Java代理程序调用的Java脚本库中 位于用户的“jvm / lib / ext”目录下的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)向我指出的,所以非常感谢他出面.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读