detectClassPathResourcesToStage - 无法转换 url

detectClassPathResourcesToStage - Unable to convert url

当我在 GCE 中 运行 jar 时,出现以下错误:

java -jar mySimple.jar --project=myProjcet

Aug 13, 2015 1:22:26 AM com.google.cloud.dataflow.sdk.runners.DataflowPipelineRunner detectClassPathResourcesToStage
SEVERE: Unable to convert url (rsrc:./) to file.
Aug 13, 2015 1:22:26 AM simple.SimpleV1 main
SEVERE: Failed to construct instance from factory method com.google.cloud.dataflow.sdk.runners.BlockingDataflowPipelineRunner#fromOptions

我正在研究 Eclipse(window)。它成功地通过 eclipse 运行 数据流。将项目打包成Runable jar文件并上传到GCE(ubuntu)。当我 运行 GCE 上的 jar 文件时出现错误 (ubuntu).

运行ner 是 BlockingDataflowPipelineRunner(批处理模式)。 源代码中还有其他选项。

下面是明显的。

Manifest-Version: 1.0
Rsrc-Class-Path: ./ httpclient-4.3.6.jar httpcore-4.3.3.jar commons-lo
 gging-1.1.3.jar commons-codec-1.6.jar mybatis-3.2.8.jar mysql-connect
 or-java-5.1.34.jar ibatis2-common-2.1.7.597.jar ibatis2-dao-2.1.7.597
 .jar ibatis2-sqlmap-2.1.7.597.jar geoip-api-1.2.14.jar google-api-cli
 ent-java6-1.20.0.jar google-api-client-1.20.0.jar google-oauth-client
 -1.20.0.jar guava-jdk5-13.0.jar google-oauth-client-java6-1.20.0.jar 
 google-oauth-client-jetty-1.20.0.jar jetty-6.1.26.jar jetty-util-6.1.
 26.jar servlet-api-2.5-20081211.jar google-http-client-jackson2-1.20.
 0.jar google-http-client-1.20.0.jar jsr305-1.3.9.jar joda-time-2.8.1.
 jar slf4j-api-1.7.7.jar slf4j-jdk14-1.7.7.jar commons-csv-1.1.jar aws
 -java-sdk-sqs-1.10.5.1.jar aws-java-sdk-core-1.10.5.1.jar google-clou
 d-dataflow-java-sdk-all-0.4.150710.jar google-api-services-dataflow-v
 1b3-rev4-1.19.1.jar google-cloud-dataflow-java-proto-library-all-0.4.
 150612.jar protobuf-java-2.5.0.jar google-api-services-bigquery-v2-re
 v187-1.19.1.jar google-api-services-compute-v1-rev46-1.19.1.jar googl
 e-api-services-pubsub-v1beta2-rev1-1.19.1.jar google-api-services-sto
 rage-v1-rev25-1.19.1.jar google-api-services-datastore-protobuf-v1bet
 a2-rev1-2.1.2.jar google-http-client-protobuf-1.15.0-rc.jar google-ht
 tp-client-jackson-1.15.0-rc.jar jackson-annotations-2.4.2.jar jackson
 -databind-2.4.2.jar avro-1.7.7.jar jackson-core-asl-1.9.13.jar jackso
 n-mapper-asl-1.9.13.jar paranamer-2.3.jar snappy-java-1.0.5.jar commo
 ns-compress-1.9.jar jetty-server-9.2.10.v20150310.jar javax.servlet-a
 pi-3.1.0.jar jetty-http-9.2.10.v20150310.jar jetty-io-9.2.10.v2015031
 0.jar jetty-jmx-9.2.10.v20150310.jar jetty-util-9.2.10.v20150310.jar 
 jackson-core-2.6.0.jar
Class-Path: .
Rsrc-Main-Class: simple.SimpleV1
Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader

使用 Eclipse 导出 Runnable JAR 文件时,可以通过三种方式打包项目:

  1. 将所需的库提取到生成的 JAR
  2. 将所需的库打包到生成的 JAR 文件中
  3. 将所需的库复制到生成的 JAR 旁边的子文件夹中

所有 3 个选项,在执行时具有相同的使用模式,例如

java -jar myrunnable.jar --myCommandLineOption1=...

目前,只有选项 1 与 Java 的数据流 SDK 能够检测要暂存的资源的方式兼容,因为它依赖于它们是来自 URL[=53= 的文件 URI ]装载机。

有关如何创建 Runnable Jar 的说明以及问题原因的更具体细节,请阅读下文。

使用 Runnable Jars 的替代解决方案是使用 mvn exec 执行您的项目。

选项 1

这将创建一个 jar,它将每个单独 jar 中的所有 class 文件和资源复制到一个 jar 中。这允许一个清单,其中整个 class 路径由基于文件的 URI 组成:

Manifest-Version: 1.0
Main-Class: com.google.cloud.dataflow.starter.StarterPipeline
Class-Path: .

选项 2

这将创建一个 jar 文件,其中嵌入了其他 jar。它使用一个自定义主入口点 (org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader),它知道如何读取自定义清单条目 (Rsrc-Class-Path & Rsrc-Main-Class) 并创建一个 classloader 具有非基于文件的 URI。由于 Java 的 Dataflow SDK 目前只知道如何处理基于文件的资源,不知道如何解释 rsrc:... URI,因此您会遇到以下异常你看见了。

Manifest-Version: 1.0
Rsrc-Class-Path: ./ httpclient-4.3.6.jar ...
Class-Path: .
Rsrc-Main-Class: simple.SimpleV1
Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader

选项 3

这将创建一个包含您的项目资源的 jar 文件,然后在包含所有项目相关 jar 的可运行 jar 旁边创建一个文件夹。这允许列出所有项目依赖项的更复杂的标准清单。

Manifest-Version: 1.0
Main-Class: com.google.cloud.dataflow.starter.StarterPipeline
Class-Path: . runnable_lib/google-cloud-dataflow-java-sdk-all-manual_build.jar ...

Class-Path 清单不会返回 URLClassLoader 的一部分,因此这些 classes 是不可发现的。此外,这些 jar 只能由 classes 从该 jar 加载,这会导致 jar 加载层次结构。此处提供更多详细信息:http://docs.oracle.com/javase/7/docs/technotes/tools/findingclasses.html