Google cloud dataflow 用于数据流中反射的类加载器

Google cloud dataflow 用于数据流中反射的类加载器,google-cloud-dataflow,Google Cloud Dataflow,我需要通过反射(为了序列化目的)将一些类加载到Google数据流管道中。代码在本地运行良好;但是当我在谷歌云上远程运行它时,它找不到类 我几乎可以肯定,他与用于暂存文件的类加载器有关。是否有人成功地在数据流管道中使用反射 以下是我迄今为止所尝试的: Reflections reflections = new Reflections( ClasspathHelper.forClassLoader(Thread.currentThread().getContextClassL

我需要通过反射(为了序列化目的)将一些类加载到Google数据流管道中。代码在本地运行良好;但是当我在谷歌云上远程运行它时,它找不到类

我几乎可以肯定,他与用于暂存文件的类加载器有关。是否有人成功地在数据流管道中使用反射

以下是我迄今为止所尝试的:

Reflections reflections = new Reflections(
            ClasspathHelper.forClassLoader(Thread.currentThread().getContextClassLoader()),
            ClasspathHelper.forClass(Object.class),
            PipelineOptionsFactory.class.getClassLoader(),
            ClassLoader.getSystemClassLoader()
    );

Set<Class<? extends Event>> events = reflections.getSubTypesOf(Event.class);
反射=新反射(
ClasspathHelper.forClassLoader(Thread.currentThread().getContextClassLoader()),
ClasspathHelper.forClass(Object.class),
PipelineOptionFactory.class.getClassLoader(),
ClassLoader.getSystemClassLoader()
);

设置我认为这是反射或如何使用反射的问题

所有暂存的jar都应该在类路径上可用,并且Dataflow不会对类加载器做任何棘手的事情。为了验证,我创建了一个简单的测试,它直接使用使用的
Class.findClass
加载该类。它不适用于
Object.class.getClassLoader()
,但使用以下任何一项都可以:

  • ClassLoader.getSystemClassLoader()
  • Thread.currentThread().getContextClassLoader()
  • PipelineOptionsFactory.class.getClassLoader()
我玩了一会儿,试图让思考发挥作用。我可以通过显式地将其设置为(1)加载我的主类(
SomeClass
)和(2)加载该类的所有子类型(使用
subsubjectscanner
)。我使用了以下方法:

Reflections r = new Reflections(new ConfigurationBuilder()
             .addClassLoaders(ClassLoader.getSystemClassLoader())
             .addUrls(ClasspathHelper.forClass(SomeClass.class))
             .addScanners(new SubTypesScanner()));
Set<Class<? extends SomeClass>> set = r.getSubTypesOf(SomeClass.class);
Reflections r=新反射(新配置生成器()
.addClassLoaders(ClassLoader.getSystemClassLoader())
.addURL(ClasspathHelper.forClass(SomeClass.class))
.addScanners(新的子扫描程序());

你确定你要加载的类实际上是暂存文件的一部分吗?如果没有,它们将无法在工作进程上使用,并且反射将失败。您可以包括您收到的错误消息吗?我基本上确定这些类是临时文件的一部分;因为它们在代码的其他地方使用。我没有收到任何具体的错误消息;just
reflections.GetSubsetSof(Event.class)
返回一个空集。只需检查暂存的zip文件和类文件就在那里。根据您的建议,我使用了一个基于示例的配置生成器+
ClasspathHelper.forClass(Event.class)
和实际的父类,我需要这些子类型,这确实有效!谢谢