簡體   English   中英

Java / Dataflow - 無法使用ClassLoader來檢測類路徑元素

[英]Java/Dataflow - Unable to use ClassLoader to detect classpath elements

我猜這更像是一個普通的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 dataflow / apache beam文檔都沒有提到有關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    

我認為這是Java 9特有的問題。 Beam尚未正式支持Java 9 - 請參閱https://issues.apache.org/jira/browse/BEAM-2530了解當前進展情況。

您可以嘗試通過--filesToStage指定類路徑元素來解決此特定問題(這將繞過基於當前類加載器的自動檢測 - 這是失敗的)。 但是你可能遇到其他問題。

在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())
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM