Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OSGi:如何获取其他包的类加载器_Java_Osgi_Osgi Bundle_Eclipse Virgo - Fatal编程技术网

Java OSGi:如何获取其他包的类加载器

Java OSGi:如何获取其他包的类加载器,java,osgi,osgi-bundle,eclipse-virgo,Java,Osgi,Osgi Bundle,Eclipse Virgo,我有一个Virgo Tomcat服务器正在运行。有一个EnumMap,其密钥为 bundle.a.MyEnum 通过接收来自此映射的上下文 bundle.b 使用SpelExpressionParser的Spring表达式语言,示例表达式是“get(T(bundle.a.MyEnum.SAMPLEKEY)”。解析器(分别是其类型定位器)需要访问bundle.a的类加载器 所以我做了: TypeLocator typeLocator = new StandardTypeLocator(getB

我有一个Virgo Tomcat服务器正在运行。有一个EnumMap,其密钥为

bundle.a.MyEnum
通过接收来自此映射的上下文

bundle.b
使用SpelExpressionParser的Spring表达式语言,示例表达式是“get(T(bundle.a.MyEnum.SAMPLEKEY)”。解析器(分别是其类型定位器)需要访问bundle.a的类加载器

所以我做了:

TypeLocator typeLocator = new StandardTypeLocator(getBundleAClassLoader());
StandardEvaluationContext evaluationContext  = new StandardEvaluationContext();
evaluationContext.setTypeLocator(typeLocator);
spelExpressionParser = new SpelExpressionParser();
spelExpressionParser.parseExpression(expression)).getValue(evaluationContext, context);
问题是,在bundle.b类中获取bundle.a类加载器的正确方法是什么? 经过几次尝试,我发现唯一可行的解决方案是:

private static ClassLoader getBundleAClassLoader() {
    MyEnum bundleARef = MyEnum.SAMPLEKEY;
    return bundleARef.getClass().getClassLoader();
}
编辑:解决方案

getBundleAClassLoader()
没有必要,

TypeLocator typeLocator = new StandardTypeLocator(this.getClass().getClassLoader());

很好。这听起来太复杂了。只需在bundle.b的清单中执行导入包,您就可以用与您自己的类型相同的方式访问该类型。

这听起来太复杂了。只需在bundle.b的清单中导入一个包,您就可以用与您自己的类型相同的方式访问该类型。

SomeClassOfBundle.class.getClassLoader()

e、 g


bundle.b导入bundle.a,但如果没有StandardEvaluationContext,Spring类SpelParserExpression将使用bundle.b的类加载器,从而生成ClassNotFoundException如果bundle.b导入MyEnum的包,那么bundle.b的类加载器将发现类bundkle.a.MyEnumI的错误,它可以工作。我猜我在尝试此操作时,TypeLocator设置不正确。getClass().getClassLoader()。谢谢bundle.b导入bundle.a,但如果没有StandardEvaluationContext,Spring类SpelParserExpression将使用bundle.b的类加载器,从而生成ClassNotFoundException如果bundle.b导入MyEnum的包,那么bundle.b的类加载器将发现类bundkle.a.MyEnumI的错误,它可以工作。我猜我在尝试此操作时,TypeLocator设置不正确。getClass().getClassLoader()。谢谢我尝试了第一个建议,但没有成功。我还尝试了第二种方法,Bundle b=bundleContext.getBundle(),它将生成Bundle.b,从而生成它的类加载器。也许我应该改用getBundles()并得到正确的一个。你说“不起作用”是什么意思?线束接线错误?如果要使用第一种方法,您需要在清单文件中为SomeClassOfBundle的包创建一个导入包。我确定昨天我测试了第一种方法,并收到了ClassNotFoundException。然而,我再次测试了它,它成功了。我接受了他的答案,但还是要谢谢你。我尝试了第一个建议,但没有成功。我还尝试了第二种方法,Bundle b=bundleContext.getBundle(),它将生成Bundle.b,从而生成它的类加载器。也许我应该改用getBundles()并得到正确的一个。你说“不起作用”是什么意思?线束接线错误?如果要使用第一种方法,您需要在清单文件中为SomeClassOfBundle的包创建一个导入包。我确定昨天我测试了第一种方法,并收到了ClassNotFoundException。然而,我再次测试了它,它成功了。既然基督徒的答案引导我找到这个。getClass()。getClassLoader()我接受了他的答案,但还是要感谢你们。
bundle.adapt(BundleWiring.class).getClassLoader()