Java/Dataflow - 无法使用 ClassLoader 检测类路径元素

Posted

技术标签:

【中文标题】Java/Dataflow - 无法使用 ClassLoader 检测类路径元素【英文标题】:Java/Dataflow - Unable to use ClassLoader to detect classpath elements 【发布时间】:2018-06-25 19:48:32 【问题描述】:

我猜这更像是一个一般的 Java/Eclipse 问题,但我不是 Java 人,这对我来说不是点击。最后的堆栈跟踪。

https://github.com/apache/beam/blob/9d9ffa5f1a3a9f280dfafae15944764a568515ef/runners/google-cloud-dataflow-java/src/main/java/org/apache/beam/runners/dataflow/DataflowRunner.java

上面是抛出错误的文件,它非常简单——我们是否使用URLClassLoader?不是 Java 人,我不明白如何切换到 URLClassLoader,谷歌搜索这让我觉得这不是我需要关心的事情。

"Unable to use ClassLoader to detect classpath elements"

让我觉得我错误地添加了一个类路径,而 Eclipse 正在做一些奇怪的事情。

Google 数据流/apache 光束文档均未提及 URLClassLoader,现在我什至无法运行他们的示例项目。我很确定我做了什么,但我不确定是什么。

任何帮助将不胜感激。

Jan 16, 2018 8:03:48 PM org.apache.beam.runners.dataflow.DataflowRunner 

detectClassPathResourcesToStage
SEVERE: Unable to use ClassLoader to detect classpath elements. Current ClassLoader is jdk.internal.loader.ClassLoaders$AppClassLoader@3b764bce, only URLClassLoaders are supported.
Exception in thread "main" java.lang.RuntimeException: Failed to construct instance from factory method DataflowRunner#fromOptions(interface org.apache.beam.sdk.options.PipelineOptions)
    at org.apache.beam.sdk.util.InstanceBuilder.buildFromMethod(InstanceBuilder.java:233)
    at org.apache.beam.sdk.util.InstanceBuilder.build(InstanceBuilder.java:162)
    at org.apache.beam.sdk.PipelineRunner.fromOptions(PipelineRunner.java:52)
    at org.apache.beam.sdk.Pipeline.create(Pipeline.java:142)
    at twitchInsights.MainPipeline.main(MainPipeline.java:59)
Caused by: java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:564)
    at org.apache.beam.sdk.util.InstanceBuilder.buildFromMethod(InstanceBuilder.java:222)
    ... 4 more
Caused by: java.lang.IllegalArgumentException: Unable to use ClassLoader to detect classpath elements. Current ClassLoader is jdk.internal.loader.ClassLoaders$AppClassLoader@3b764bce, only URLClassLoaders are supported.
    at org.apache.beam.runners.dataflow.DataflowRunner.detectClassPathResourcesToStage(DataflowRunner.java:1365)
    at org.apache.beam.runners.dataflow.DataflowRunner.fromOptions(DataflowRunner.java:244)
    ... 9 more

完全例外:

Thread [main] (Suspended (exception IllegalArgumentException))  
DataflowRunner.detectClassPathResourcesToStage(ClassLoader) line: 1365  
DataflowRunner.fromOptions(PipelineOptions) line: 244   
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]  
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 62  
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43  
Method.invoke(Object, Object...) line: 564  
InstanceBuilder<T>.buildFromMethod(Class<?>[]) line: 222    
InstanceBuilder<T>.build() line: 162    
PipelineRunner<ResultT>.fromOptions(PipelineOptions) line: 52   
Pipeline.create(PipelineOptions) line: 142  
MainPipeline.main(String[]) line: 60    

【问题讨论】:

发布完整的 IllegalArgumentException - 有人在调用 LoadCLass 看起来不像? 【参考方案1】:

我认为这是 Java 9 特有的问题。 Beam 尚未正式支持 Java 9 - 请参阅 https://issues.apache.org/jira/browse/BEAM-2530 了解当前进展。

您可以尝试通过--filesToStage 指定类路径元素来解决此特定问题(这将绕过基于当前类加载器的自动检测 - 这是失败的原因)。但是,您可能会遇到其他问题。

【讨论】:

已确认。我在使用 Java 9 时也遇到了同样的问题。现在推荐使用 Java 8。 是的。感谢 jkff 和 A​​ndrew。 我使用 java 8 尝试过,但仍然出现错误。所以我切换回 java 9.【参考方案2】:

在 Java 9 中对我有用的解决方法是基于类路径以编程方式定义 filesToStage。

她是一个如何从类路径生成文件集的示例:

dataflowPipelineOptions.setFilesToStage( 
  Arrays.
    asList(System.getProperty("java.class.path").split(File.pathSeparator)).
    stream().
    map(entry -> new File(entry).toString()).
    collect(Collectors.toList())
)

【讨论】:

以上是关于Java/Dataflow - 无法使用 ClassLoader 检测类路径元素的主要内容,如果未能解决你的问题,请参考以下文章

Google Clas-s-room API - 权限被拒绝

Google Clas-s-room Apps 脚本 - CourseWork.list 权限错误

inner calss and anonymous clas 得区别

Google 课堂测试帐户无法访问云端硬盘

如何使用他们的 API 访问 Google Clas-s-room 中的“等级类别”

如何使用 PHP 从 Google Clas-s-room 课程列表中过滤课程对象字段