1

我想在 OSGi 包中找到所有用我的自定义注释注释的类,
实际扫描必须在包本身内部进行,或者从另一个包中进行,
我尝试过使用ClassPathScanningCandidateComponentProvider,但它会导致异常:

java.io.FileNotFoundException: URL [bundleresource://38.fwk29597962/my/base/package/] cannot be resolved to absolute file path because it does not reside in the file system: bundleresource://38.fwk29597962/my/base/package/

我有 99% 的把握,像reflections其他扫描库这样的解决方案也不起作用,现在不记得为什么了

我可以像这样配置组件扫描:

<context:annotation-config />
<context:component-scan base-package="my.base.package" use-default-filters="false">
    <context:include-filter type="annotation" expression="path.to.my.annotation"/>
</context:component-scan>

并从bean工厂获得我需要的东西,但这需要将@Scope(“prototype”)添加到我所有带注释的类中,所以spring默认情况下不会创建单例等等。
有什么更好的解决方案吗?

-我的注释类没有@Component 或任何与spring 相关的东西
-osgi 框架(eclipse equinox 3.8)嵌入到Web 应用程序中
-使用spring 3.2.3 和gemini-blueprint 2.0.0.M02

4

1 回答 1

3

如果您准备在构建时而不是在运行时进行扫描,那么 bnd 有一个相当不错的宏,您可以使用:

MyAnnotated-Classes: ${classes;CONCRETE;ANNOTATION;org.example.MyAnnotation}

...这将MyAnnotated-Classes在清单中生成一个标题,列出捆绑包中所有具有@MyAnnotation. 在运行时扫描此标头现在很简单。

这种方法是对运行时类路径扫描的显着优化。运行时扫描也可能不可靠,因为您需要捕获 的内容Bundle-ClassPath,但要避免任何导入/必需的类。

于 2013-10-01T12:39:42.360 回答