Является ли установка внешних банок в каталоге JAVA_HOME/lib/ext плохим?

У нас есть приложение, которое работает в среде JRE. Приложение использует некоторые внешние банки, и мы помещаем их в папку JAVA_HOME/lib/ext. Это сработало для нас годами, но недавно к нашей команде присоединился новый программист, и, похоже, это то, как это плохо. Я не могу понять, почему, и я пытаюсь провести какое-то исследование, прежде чем я поеду дальше с этим разработчиком. Здесь что-то не хватает?

Ответ 1

Да, это плохо. Подумайте об этом: приложение зависит от JRE и некоторых дополнительных банок. Что делать, если вы обновите JRE? Затем вы должны помнить, чтобы скопировать файлы в новую JRE. Что делать, если вам нужно настроить приложение на новую систему? Вы должны скопировать приложение там, а затем также не забудьте скопировать внешние банки в JRE в этой системе.

Оба эти вопроса не будут проблемой вообще, если вы просто упакуете приложение должным образом вместе с внешними банками, в которых оно нуждается. Если вы этого не видите, возможно, это не проблема. Но вы все равно должны быть благодарны новому парню за то, что он поделился своим мнением.

Ответ 2

В дополнение к ответу weiji (упаковка и обновления к новым версиям JVM) существуют и другие риски.

Если вы используете диспетчер безопасности в любом из ваших приложений, библиотеки во ext часто имеют гораздо больше возможностей по умолчанию - они обрабатываются так же, как и системные библиотеки. Вы должны быть уверены, что вы можете доверять в смысле соблюдения правил безопасности этих классов. Проанализировали ли авторы то, что они разоблачили? Если эти классы не используют контроль доступа для изменения контекста безопасности, вам не нужно беспокоиться об этом, но знаете ли вы, что они делают или не делают (например, метод, который обеспечивает доступ к файлу и использует AccessController, обеспечивает ли он что у вызывающего есть права доступа к файлам?)

Могут ли все ваши приложения использовать ту же самую версию библиотеки? Что происходит, когда вам нужно обновить эту библиотеку (а не только JVM)? Вы нарушите любое из своих приложений? Вам нужно будет все повторить. Библиотеки в ext загружаются загрузчиком класса расширения, который из-за родительского делегирования имеет более высокий приоритет, чем обычный (т.е. CLASSPATH) загрузчик, поэтому они гарантированно будут использоваться вашим приложением, и нет возможности для отдельного приложения переопределить библиотека в ext с другой версией.

Если вы хотите обмениваться библиотеками в своих приложениях, почему бы и нет, вместо этого предоставить отдельную папку общих библиотек, которую можно индивидуально настроить приложения (CLASSPATH) для ссылки. Затем, если у вас есть проблемы с одним приложением и библиотекой, вы можете переключиться на другую версию библиотек или только на эту, поместите ее ранее в CLASSPATH (если это работает, вы должны проверить это тоже, так как могут быть другие зависимости вопросы). Это позволит вам иметь более индивидуальный контроль для каждого приложения. Но тогда объединение всех необходимых библиотек с вашим приложением является самым безопасным, поскольку вы можете повторно протестировать и внедрить обновления библиотек в отдельные приложения.

Ответ 3

Также выглядит как JEP-220 якобы отвергает это поведение с помощью некоторых произвольных способов "возможно заменить его" каким-то другим поведением.