Загрузите внешнюю банку с помощью загрузчика системных классов в Jetty

Я использую Jetty (8 и 9) вместе с сжатием LZ4, и я хотел бы использовать нативную реализацию LZ4, которая является нативной привязкой к библиотеке C. Для этого классы LZ4 должны быть загружены системным загрузчиком классов.

Итак, мой вопрос: как загрузить внешнюю банку с помощью загрузчика системных классов в Jetty.

Размещение библиотеки в $jetty.home/lib/ext не помогло, поскольку она была загружена с помощью загрузчика классов расширения вместо системного.


person Ilya Patrikeev    schedule 04.12.2017    source источник


Ответы (1)


Когда Jetty запускается, он создает пользовательский ClassLoader для соответствия различным требованиям спецификации (JSP, CDI, OSGi, Java9 и т. д.).

System ClassLoader в основном существует только для хранения файлов jar, связанных с JVM (и, возможно, XBootClasspath и расширение JVM).

Jetty lib/ext не имеет отношения к механизмам расширения JVM, не путайте эти 2.

Возможно, ваши банки сжатия LZ4 должны быть загружены с помощью различных механизмов расширения JVM, прежде чем Jetty подключится к ClassLoaders.

Что-то типа ...

$ java <load_LZ4_jars_via_ext_stuff> -jar start.jar
# example
$ java -Djava.ext.dirs=/full/path/to/lz4.jar -jar start.jar

Примечание. Java 9 снова меняет все, поэтому все, что вы изучаете сейчас, придется забыть, и вам нужно будет использовать новые приемы Java 9 (см. JEP 220 и его устаревание/замена поведения расширений JVM и почти устранение концепции System ClassLoader)

person Joakim Erdfelt    schedule 08.12.2017
comment
Здесь не совсем подходит терминология. Система (или загрузчик классов приложений) используется для загрузки классов приложений по пути к классу или пути к модулю. Это загрузчик, который загружает основные классы, такие как java.lang.Object. Я не знаю, что вы подразумеваете под почти полным устранением... - Я подозреваю, что вы имеете в виду, что концепция пути к классу загрузки в основном была удалена в JDK 9. Все подробности по этой теме находятся в JEP 261. - person Alan Bateman; 08.12.2017
comment
Поведение загрузчика классов в Java 9 сильно отличается. Учтите, что: классы загрузки, расширения, не-UrlClassLoader и даже то, какие классы выбраны в зависимости от целевой платформы (JEP 238), повлияют на ОП в этом конкретном вопросе. - person Joakim Erdfelt; 11.12.2017