detectClassPathResourcesToStage - Невозможно преобразовать URL

Когда я запускаю флягу в GCE, у нее была следующая ошибка:

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(окно). И ему удалось запустить поток данных через затмение. Упаковка проекта в Runable файл JAR и загружен в GCE (Ubuntu). И у меня были ошибки при запуске файла JAR на GCE (Ubuntu).

бегун - 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

1 ответ

Решение

При экспорте файла JAR Runnable с использованием Eclipse существует три способа упаковки вашего проекта:

  1. Извлечь необходимые библиотеки в сгенерированный JAR
  2. Упакуйте необходимые библиотеки в сгенерированный JAR
  3. Скопируйте необходимые библиотеки в подпапку рядом с сгенерированным JAR

Все 3 варианта имеют одинаковую схему использования при выполнении, например

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

В настоящее время только вариант 1 совместим с тем, как SDK Dataflow для Java может обнаруживать ресурсы для подготовки, поскольку он зависит от того, являются ли они файловыми URI из URLClassLoader.

Для объяснения того, как создаются Runnable Jar, и для более подробной информации, почему это было проблематично, читайте далее ниже.

Альтернативное решение использования Runnable Jars - выполнить ваш проект с помощью mvn exec.

Опция 1

Это создает банку, которая копирует все файлы и ресурсы класса в каждой отдельной банке в одну банку. Это учитывает манифест, в котором весь путь к классам состоит из файловых 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), и создает загрузчик классов на основе не файлов URIs. Поскольку Dataflow SDK для Java в настоящее время знает только, как обрабатывать файловые ресурсы, и не знает, как интерпретировать URI rsrc:..., вы получаете исключение, которое вы видите.

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 и, следовательно, эти классы не могут быть обнаружены. Кроме того, эти файлы должны быть загружены только классами из этого файла, что может привести к иерархии загрузки файлов. Более подробная информация доступна здесь: http://docs.oracle.com/javase/7/docs/technotes/tools/findingclasses.html

Другие вопросы по тегам