Java OSGi:如何获取其他包的类加载器
我有一个Virgo Tomcat服务器正在运行。有一个EnumMap,其密钥为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
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()