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 существует три способа упаковки вашего проекта:
- Извлечь необходимые библиотеки в сгенерированный JAR
- Упакуйте необходимые библиотеки в сгенерированный JAR
- Скопируйте необходимые библиотеки в подпапку рядом с сгенерированным 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