Первое, что мы сразу вспоминаем, когда видим класс java.net.URL — это то, что он такой же матерый, как и первая версия java (@since JDK1.0). Второе — он встречается почти во всех java программах. Третье — чаще всего в нем используют протоколы file, jar и http.
![](https://habrastorage.org/r/w1560/files/0c7/078/225/0c707822507e4a1096e3e7d99424e952.png)
А можно ли с помощью java.net.URL получить данные по протоколу CIFS/SMB, SCP, из HDFS — файловой системы хадупа или из maven репозитария? А получить изображение с веб камеры одной строчкой new URL('camel:/webcam:spycam?resolution=HD720').openStream()?
Для особо любопытных сразу скажу, что это легко сделать с помощью UniversalURLStreamHandlerFactory. Надо лишь использовать groovy-grape-aether-2.4.5.4.jar для запуска груви, где он уже включен по-умолчанию.
В java же прийдется добавить зависимость com.github.igor-suhorukov:mvn-classloader:1.6 в проект и написать чуть больше кода для инициализации.
Начнем с простых примеров, а треш и угар оставим на финал публикации.
Очень просто захватить кадр с вебкамеры с помощью camel webcam component и сохранить в файл snap.png.
webcam_to_file.groovy в одну строчку:
java -jar groovy-grape-aether-2.4.5.4.jar webcam_to_file.groovy
Немного сложнее захватить кадр с веб камеры и показать его в окне. Результат работы этого скрипта вы уже видели в скриншоте к статье.
webcam_to_screen.groovy
java -jar groovy-grape-aether-2.4.5.4.jar webcam_to_screen.groovy
Итак, вся эта магия доступна благодаря UniversalURLStreamHandlerFactory — обработчику URL для подгружаемых реализаций протоколов. Подгружает он их из maven репозитария либо использует локальный кеш репозитария.
Сейчас для URL поддерживаются протоколы:
Зарегистрировать универсальный обработчик в java программе просто — лишь добавить инициализацию перед использованием таких экзотических адресов в URL:
Но надо помнить об ограничении стандартной библиотеки java, что вызывать java.net.URL.setURLStreamHandlerFactory можно только один раз за все время работы программы.
Разработать UniversalURLStreamHandlerFactory вдохновила идея из проекта paxurl и его предшественника hansa. PaxUrl — отлично работает в OSGI контейнерах, а решение из статьи в standalone jvm приложениях.
Да, кстати, синтаксис работает и для получения groovy скриптов с помощью сотен протоколов!
java -jar groovy-grape-aether-2.4.5.4.jar mvn:/groupId:artifactId[:extension[:classifier]]:version[?custom_repository_URL]
java -jar groovy-grape-aether-2.4.5.4.jar vfs:/sftp://myusername:mypassword@somehost/pub/downloads/my_script.groovy (либо с аутентификацией по ssh ключу).
Проекты доступны на github: camel-url-handler, vfs-url-handler, mvn-classloader, groovy-grape-aether.
Удачи вам с новым использованием давно знакомой технологии!
![](https://habrastorage.org/files/0c7/078/225/0c707822507e4a1096e3e7d99424e952.png)
А можно ли с помощью java.net.URL получить данные по протоколу CIFS/SMB, SCP, из HDFS — файловой системы хадупа или из maven репозитария? А получить изображение с веб камеры одной строчкой new URL('camel:/webcam:spycam?resolution=HD720').openStream()?
Для особо любопытных сразу скажу, что это легко сделать с помощью UniversalURLStreamHandlerFactory. Надо лишь использовать groovy-grape-aether-2.4.5.4.jar для запуска груви, где он уже включен по-умолчанию.
В java же прийдется добавить зависимость com.github.igor-suhorukov:mvn-classloader:1.6 в проект и написать чуть больше кода для инициализации.
Начнем с простых примеров, а треш и угар оставим на финал публикации.
Очень просто захватить кадр с вебкамеры с помощью camel webcam component и сохранить в файл snap.png.
webcam_to_file.groovy в одну строчку:
com.github.igorsuhorukov.codehaus.plexus.util.IOUtil.copy(new URL('camel:/webcam:spycam?resolution=HD720').openStream(), new FileOutputStream('snap.png'))
java -jar groovy-grape-aether-2.4.5.4.jar webcam_to_file.groovy
Немного сложнее захватить кадр с веб камеры и показать его в окне. Результат работы этого скрипта вы уже видели в скриншоте к статье.
webcam_to_screen.groovy
import groovy.swing.SwingBuilder
import javax.imageio.ImageIO
import javax.swing.*
def swing = new SwingBuilder()
swing.edt {
frame(title: 'Webcam protocol', defaultCloseOperation: JFrame.EXIT_ON_CLOSE, pack: true, show: true) {
vbox {
swing.panel() {
def webcamStream = new URL('camel:/webcam:spycam?resolution=HD720').openStream()
label(new JLabel(new ImageIcon(ImageIO.read(webcamStream))))
}
}
}
}
java -jar groovy-grape-aether-2.4.5.4.jar webcam_to_screen.groovy
Итак, вся эта магия доступна благодаря UniversalURLStreamHandlerFactory — обработчику URL для подгружаемых реализаций протоколов. Подгружает он их из maven репозитария либо использует локальный кеш репозитария.
Сейчас для URL поддерживаются протоколы:
- mvn: — позволяет читать артефакт из maven репозитария groupId:artifactId[:extension[:classifier]]:version[?custom_repository_URL]
- vfs: — 16 протоколов из commons-vfs
- camel: пытаюсь поддерживать 189 протоколов из компонентов apache camel
Зарегистрировать универсальный обработчик в java программе просто — лишь добавить инициализацию перед использованием таких экзотических адресов в URL:
java.net.URL.setURLStreamHandlerFactory(new com.github.igorsuhorukov.url.handler.UniversalURLStreamHandlerFactory());
Но надо помнить об ограничении стандартной библиотеки java, что вызывать java.net.URL.setURLStreamHandlerFactory можно только один раз за все время работы программы.
Разработать UniversalURLStreamHandlerFactory вдохновила идея из проекта paxurl и его предшественника hansa. PaxUrl — отлично работает в OSGI контейнерах, а решение из статьи в standalone jvm приложениях.
Да, кстати, синтаксис работает и для получения groovy скриптов с помощью сотен протоколов!
java -jar groovy-grape-aether-2.4.5.4.jar mvn:/groupId:artifactId[:extension[:classifier]]:version[?custom_repository_URL]
java -jar groovy-grape-aether-2.4.5.4.jar vfs:/sftp://myusername:mypassword@somehost/pub/downloads/my_script.groovy (либо с аутентификацией по ssh ключу).
Проекты доступны на github: camel-url-handler, vfs-url-handler, mvn-classloader, groovy-grape-aether.
Удачи вам с новым использованием давно знакомой технологии!