Плохо ли помещать внешние jar-файлы в каталог JAVA_HOME / lib / ext? - PullRequest
14 голосов
/ 15 января 2010

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

Ответы [ 3 ]

23 голосов
/ 15 января 2010

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

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

10 голосов
/ 15 января 2010

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

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

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

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

1 голос
/ 11 июня 2016

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...