Поддержка Java 9 Jigsaw для javaagent

Есть ли какой-либо план в Java 9 (в частности, Jigsaw) для поддержки особых требований агентов мониторинга Java?

Как правило, агентам мониторинга требуется возможность доступа к классам, пакетам и модулям, которые недоступны по умолчанию для исходных приложений Java. Агенты мониторинга, загружаемые в JVM с помощью аргумента командной строки -javaagent, не загружаются как модули, даже если файл jar содержит файл module-info.class. Единственный способ, которым я смог предоставить своему агенту мониторинга необходимые ему разрешения, — это добавить аргументы командной строки, которые предоставляют эти разрешения всем безымянным модулям.


person BradW    schedule 22.02.2017    source источник


Ответы (1)


Instrumentation был расширен методом, позволяющим переопределять любой модуль. Это позволяет вам добавлять дополнительные чтения модулей, экспортировать, открывать, использовать сервисы и предоставлять:

void redefineModule(Module module,
                    Set<Module> extraReads,
                    Map<String,Set<Module>> extraExports,
                    Map<String,Set<Module>> extraOpens,
                    Set<Class<?>> extraUses,
                    Map<Class<?>,List<Class<?>>> extraProvides);

Кроме того, был расширен ClassFileTransformerAPI. для регистрации Java Module при преобразовании:

default byte[] transform(Module module,
                         ClassLoader loader,
                         String className,
                         Class<?> classBeingRedefined,
                         ProtectionDomain protectionDomain,
                         byte[] classfileBuffer)
                  throws IllegalClassFormatException;

Этот модуль в сочетании с инструментальным API позволяет выполнять любые необходимые настройки.

В настоящее время агенты Java по-прежнему загружаются по пути к классам без применения какой-либо модульности; однако это может измениться, поскольку Java 9 еще не окончательная версия.

person Rafael Winterhalter    schedule 23.02.2017
comment
Спасибо. Это очень помогло. Попробовали новый метод redefineModule(), и, похоже, он делает то, что нам нужно. - person BradW; 25.02.2017