我正在尝试设置一个ConfigurationBuilder
为图书馆Reflections
,它使用以下配置:
我通过以下方式使用图书馆Maven 依赖 http://mvnrepository.com/artifact/org.reflections/reflections/0.9.10
<dependency>
<groupId>org.reflections</groupId>
<artifactId>reflections</artifactId>
<version>0.9.10</version>
</dependency>
最新可用版本 0.9.10
以下是我需要应用于扫描仪的 3 个约束:
- 注释为
@Annotation1
or @Annotation2
- 在包中声明
package1
, package2
or package3
- 类的扩展
SuperClass.class
所有代码都在一个中执行ServletContextListener
(如果是本地主机,则触发并启动开发服务器实例)
这是我设法创建的代码
ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
// Package filter
FilterBuilder scannerFilter = new FilterBuilder();
scannerFilter.includePackage("com.mypackage1");
scannerFilter.includePackage("com.mypackage2");
scannerFilter.includePackage("com.mypackage3");
configurationBuilder.filterInputsBy(scannerFilter);
// Select the proper location to scan
configurationBuilder.setUrls(Arrays.asList(ClasspathHelper.forClass(SuperClass.class)));
Reflections reflections = new Reflections(configurationBuilder);
// Get all the classes with annotation @Annotation1 or @Annotation2
Set<Class<?>> annotation1Classes = reflections.getTypesAnnotatedWith(Annotation1.class);
Set<Class<?>> annotation2Classes = reflections.getTypesAnnotatedWith(Annotation2.class);
但它不起作用。这条线
Reflections reflections = new Reflections(configurationBuilder);
触发以下错误:
ago 26, 2015 1:22:22 PM com.google.appengine.tools.development.agent.impl.Transformer transform
GRAVE: Unable to instrument javassist.bytecode.annotation.ShortMemberValue. Security restrictions may not be entirely emulated.
java.lang.RuntimeException
at com.google.appengine.repackaged.org.objectweb.asm.MethodVisitor.visitParameter(MethodVisitor.java:114)
at com.google.appengine.repackaged.org.objectweb.asm.ClassReader.readMethod(ClassReader.java:959)
at com.google.appengine.repackaged.org.objectweb.asm.ClassReader.accept(ClassReader.java:693)
at com.google.appengine.repackaged.org.objectweb.asm.ClassReader.accept(ClassReader.java:506)
at com.google.appengine.tools.development.agent.impl.Transformer.rewrite(Transformer.java:146)
at com.google.appengine.tools.development.agent.impl.Transformer.transform(Transformer.java:113)
at sun.instrument.TransformerManager.transform(TransformerManager.java:188)
at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:424)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at com.google.appengine.tools.development.IsolatedAppClassLoader.loadClass(IsolatedAppClassLoader.java:199)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at javassist.bytecode.AnnotationsAttribute.getAnnotations(AnnotationsAttribute.java:227)
at org.reflections.adapters.JavassistAdapter.getAnnotationNames(JavassistAdapter.java:156)
at org.reflections.adapters.JavassistAdapter.getClassAnnotationNames(JavassistAdapter.java:50)
at org.reflections.adapters.JavassistAdapter.getClassAnnotationNames(JavassistAdapter.java:24)
at org.reflections.scanners.TypeAnnotationsScanner.scan(TypeAnnotationsScanner.java:12)
at org.reflections.scanners.AbstractScanner.scan(AbstractScanner.java:35)
at org.reflections.Reflections.scan(Reflections.java:250)
at org.reflections.Reflections.scan(Reflections.java:204)
at org.reflections.Reflections.<init>(Reflections.java:129)
at it.noovle.ape.core.persistence.objectify.ObjectifyManager.getClassesToRegister(ObjectifyManager.java:107)
at it.noovle.ape.core.listener.ObjectifyServantLoader.contextInitialized(ObjectifyServantLoader.java:51)
at org.mortbay.jetty.handler.ContextHandler.startContext(ContextHandler.java:548)
at org.mortbay.jetty.servlet.Context.startContext(Context.java:136)
at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
at org.mortbay.jetty.Server.doStart(Server.java:224)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at com.google.appengine.tools.development.JettyContainerService.startContainer(JettyContainerService.java:266)
at com.google.appengine.tools.development.AbstractContainerService.startup(AbstractContainerService.java:288)
at com.google.appengine.tools.development.AutomaticInstanceHolder.startUp(AutomaticInstanceHolder.java:26)
at com.google.appengine.tools.development.AbstractModule.startup(AbstractModule.java:87)
at com.google.appengine.tools.development.Modules.startup(Modules.java:105)
at com.google.appengine.tools.development.DevAppServerImpl.doStart(DevAppServerImpl.java:258)
at com.google.appengine.tools.development.DevAppServerImpl.access$000(DevAppServerImpl.java:47)
at com.google.appengine.tools.development.DevAppServerImpl$1.run(DevAppServerImpl.java:213)
at com.google.appengine.tools.development.DevAppServerImpl$1.run(DevAppServerImpl.java:211)
at java.security.AccessController.doPrivileged(Native Method)
at com.google.appengine.tools.development.DevAppServerImpl.start(DevAppServerImpl.java:211)
at com.google.appengine.tools.development.DevAppServerMain$StartAction.apply(DevAppServerMain.java:270)
at com.google.appengine.tools.util.Parser$ParseResult.applyArgs(Parser.java:48)
at com.google.appengine.tools.development.DevAppServerMain.run(DevAppServerMain.java:218)
at com.google.appengine.tools.development.DevAppServerMain.main(DevAppServerMain.java:209)
我应该提到我正在开发一个 Google App Engine 项目
我也尝试从提供的示例开始主页 https://github.com/ronmamo/reflections
//scan urls that contain 'my.package', include inputs starting with 'my.package', use the default scanners
Reflections reflections = new Reflections("my.package");
//or using ConfigurationBuilder
new Reflections(new ConfigurationBuilder()
.setUrls(ClasspathHelper.forPackage("my.project.prefix"))
.setScanners(new SubTypesScanner(),
new TypeAnnotationsScanner().filterResultsBy(optionalFilter), ...),
.filterInputsBy(new FilterBuilder().includePackage("my.project.prefix"))
...);
但我无法创建工作代码。
EDIT
从网站中提供的示例开始(并通过使用 JavaDoc),我设法创建了另一个代码
Reflections reflections = new Reflections(new ConfigurationBuilder()
.setUrls(
// Select the proper location to scan
ClasspathHelper.forClass(SuperClass.class)
)
.setScanners(
// Scan only the subtype of SuperClass
new SubTypesScanner().filterResultsBy(
new FilterBuilder()
.include(SuperClass.class.getName())
),
// Scan only the types which have the required annotations
new TypeAnnotationsScanner().filterResultsBy(
new FilterBuilder()
.include(Annotation1.class.getName())
.include(Annotation2.class.getName())
)
)
.filterInputsBy(
// Include only 3 package in the analysis
new FilterBuilder()
.includePackage("com.my.package1")
.includePackage("com.my.package2")
.includePackage("com.my.package3")
)
);
Set<Class<?>> annotation1Classes = reflections.getTypesAnnotatedWith(Annotation1.class);
Set<Class<?>> annotation2Classes = reflections.getTypesAnnotatedWith(Annotation2.class);
只要我使用这个代码就可以工作main
测试代码的方法(我这样做是为了快速测试各行代码,而不是每次在 App Engine 开发服务器上运行)。
但是由 App Engine 开发服务器执行的相同代码会触发我上面已经发布的异常错误。
然后...问题似乎与 App Engine 服务器有关,而不是严格与 Reflection 代码有关。
EDIT2
确实,在扫描期间(使用 App Engine 环境)会抛出异常(很多时候我需要添加,太多以至于 Eclipse 控制台日志无法包含所有行,并且会删除最旧的行)。
但这些异常并没有真正抛出(catch 子句将毫无意义),并且最后扫描器提供了正确的类。
此时,这些异常似乎只是由Reflections
构造函数,但它们不会停止服务器的执行。
剩下的只是了解为什么会抛出这些异常,可能与 App Engine 环境阻止 Java 的某些内部功能有关。
EDIT3
我尝试部署应用程序以查看生产环境上有什么样的行为。
与在线开发环境(记录大量严重异常)不同,没有记录任何错误,但扫描结果为 0 个类。