Pull to refresh

Comments 22

А в чем смысл поддержки протоколов camel?

Помнится если в camel написать URI вида «xxx: что-то-там», то в реестре, например Spring или OSGI, ищется xxx — который может быть настроенным компонентом (и во многих случаях является таковым). Т.е. скажем, если вы просто создадите компонент camel-activemq, то настройкам брокера будет взяться негде.

Ну т.е. тут просто загрузки класса и создания компонента в общем-то не всегда достаточно. Как это устроено?
Смысл в том, чтобы в унаследованном приложении без модификации его кода просто добавить еще одну библиотеку в classpath и читать данные, например, из hadoop file system (HDFS) или считать файл по scp. Просто за счет правки конфигурации приложения. Можно читать почти все что можно сконфигурировать в строке URI, насчет реестра вы правы — такой функциональности нет!

Ну и как экзотика — просто получить кадр с вебкамеры
new  java.net.URL("camel:/webcam:spycam?resolution=HD720").openStream()

Очень интересно! Как я понял, MavenClassLoader по дефолту автоматически загружает все зависимости в один модуль. Если я хочу изолировать некоторые зависимости в отдельные модули, я их загружаю отдельно, а затем использую вариант с parent-ом — зависимости заново загружаться не будут?

Да, верно надо колдовать с parent загрузчиком и в таких случаях поможет вариант с exclude в API ClassLoaderBuilder:

forMavenCoordinates(MavenDependency[] dependencies, ClassLoader parent)

а при создании MavenDependency можно указать какие транзитивные зависимости не надо разрешать конкретно в этом загрузчике классов
new MavenDependency(String groupArtifactVersion, Collection<String> excludes)

Интересное решение. Сейчас используем jboss-modules, как альтернативу OSGI. Но несколько напрягает отсутствие нормальной документации.


Хотел уточнить, в mvn-classloader есть ли возможность постоянно проверять и скачивать последний снапшот зависимостей? (попробовал использовать RemoteRepository и RepositoryPolicy, но что-то не вышло). И можно ли указать директорию для загружаемых артефактов?

При старте JVM нужно указать параметр -DmavenSettings=путь к вашему settings.xml
и указать в нем директорию куда сохранять артефакты
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                        http://maven.apache.org/xsd/settings-1.0.0.xsd">

<localRepository>myrepo</localRepository>

</settings>


Со снепшотами я не работал — не было нужно. Попробую на следующей неделе. Для релизных версий отлично работает LATEST вместо version.
Попробуйте решение с диапазоном версий. Как в примере с (0,]

Пришлось экранировать ] с помощью кавычек в bash
igor@igor-comp:~/dev$ java -DmavenSettings=settings.xml -Dos.detected.classifier=windows-x86_64 -jar /home/igor/.m2/repository/com/github/igor-suhorukov/mvn-classloader/1.8/mvn-classloader-1.8.jar «org.littleshoot:littleproxy:(0,]» org.littleshoot.proxy.Launcher

[Dropship WARN] No dropship.properties found! Using .dropship-prefixed system properties (-D)
[Dropship INFO] Starting Dropship v0.0
[Dropship INFO] Requested org.littleshoot:littleproxy:(0,], will load artifact and dependencies for org.littleshoot:littleproxy:(0,].
[Dropship INFO] Collecting maven metadata.
[Dropship INFO] Resolving dependencies.
[Dropship INFO] Downloaded org.littleshoot:littleproxy:1.1.0 (24426 bytes) in 122,000ms (Infinity kbytes/sec).
[Dropship INFO] Downloaded org.sonatype.oss:oss-parent:7 (4824 bytes) in 91,0000ms (Infinity kbytes/sec).
[Dropship INFO] Downloaded com.google.guava:guava:18.0 (5666 bytes) in 88,0000ms (Infinity kbytes/sec).
[Dropship INFO] Downloaded com.google.guava:guava-parent:18.0 (7686 bytes) in 86,0000ms (Infinity kbytes/sec).
[Dropship INFO] Downloaded commons-cli:commons-cli:1.3.1 (10393 bytes) in 89,0000ms (Infinity kbytes/sec).
[Dropship INFO] Downloaded org.apache.commons:commons-parent:37 (63042 bytes) in 147,000ms (Infinity kbytes/sec).
[Dropship INFO] Downloaded org.apache:apache:16 (15397 bytes) in 118,000ms (Infinity kbytes/sec).
[Dropship INFO] Downloaded commons-codec:commons-codec:1.10 (11609 bytes) in 90,0000ms (Infinity kbytes/sec).
[Dropship INFO] Downloaded org.apache.commons:commons-parent:35 (57772 bytes) in 156,000ms (Infinity kbytes/sec).

Попробовал сделать так:


RepositoryPolicy policy = new RepositoryPolicy(true, RepositoryPolicy.UPDATE_POLICY_ALWAYS, 
RepositoryPolicy.CHECKSUM_POLICY_WARN);

RemoteRepository repo = new RemoteRepository.Builder("custom", "default", repoUrl)
                .setReleasePolicy(policy).setSnapshotPolicy(policy).build();

Так вот при последующем вызове


MavenClassLoader.usingRemoteRepositories(repo).forMavenCoordinates(...)

с суфиксом -SNAPSHOT все работает (т.е. постоянно проверяет и обновляет), а без (релиз полиси) — нет. Странно, ведь полиси одинакова. LATEST и (0,] так же не помогли.


Но в принципе этого уже достаточно.

Спасибо, Вадим! Интересные вещи «раскопали», надо будет почитать документацию и подебажить как доберусь до IDE)

Супер! Дайте знать тогда, что в итоге получится! :) Спасибо!

Забыл уточнить, что в моем примере обновляется существующая версия. Не инкрементируется.

При работе с классами в java, прийдется использовать reflection

Почему? Разве нельзя cast сделать?
Пример, наверное, про случай, когда класс не доступен даже на этапе компиляции. Т.е. кастовать не к чему.
Не могу придумать пример, когда плюсы от подобной тулзы перевешивает этот минус.
(Не удержался)
Ваше право) Я как раз много где использую библиотеку из-за ее плюсов. В отличии от OSHI бандлов ничего не надо делать с исходной библиотекой и при этом можно изолировать разные версии одной и той же библиотеки в транзитивных зависимостях.
Ну, честно говоря, для OSGI мало что надо делать с исходной библиотекой. Очень мало.
К сожалению, я столкнулся на работе с существующей системой с несколькими десятками модулей. И вот там с не OSGI зависимостями была беда-беда. maven-bundle-plugin не решает и десятой части всех проблем в том проекте
Странно. Не приходилось с таким сталкиваться — у нас karaf, либо в чистом виде, либо в виде jboss fuse, и не OSGI просто деплоятся как wrap, и никаких проблем и ними нет. При сотнях модулей в сумме.
Да, именно про такой случай использования рассказывал!
Можно, но тогда API библиотеку надо добавлять в classpath приложения и для mvn загрузчика нужно указать как parent classloader загрузчик вашего класса. Есть более удобный вариант для того же самого и про него расскажу на хабре в ближайшее время.

Хотел сказать спасибо за mvn-classloader. Мне в итоге удалось его применить для изоляции плагинов. Получилось гораздо симпатичнее чем с jboss-modules и не такой оверкилл, как OSGI.

Sign up to leave a comment.

Articles