Как отключить механизм расширения Java
Наш продукт представляет собой автономное настольное приложение OS X, написанное на Java. Мы включили встроенную JRE для запуска нашего программного обеспечения.
Правила запуска JRE, похоже, помещают любые JAR файлы в /usr/lib/java
, /Library/Java/Extensions
и ~/Library/Java/Extensions
в путь к классам перед библиотеками, которые мы явно включаем в путь к классам.
Если у пользователя есть JAR файлы в любой из папок механизма расширения Java, тогда эти файлы JAR добавляются в наш путь к классам. Недавний инцидент с поддержкой возник из-за того, что у клиента была старая версия критической сторонней библиотеки в /usr/lib/java
- это приводило к неожиданному сбою нашего программного обеспечения при запуске.
Мне не удалось определить, как я могу отключить этот механизм расширения при вызове JRE, встроенного в наше приложение. Как я могу это сделать?
─────────
ПРИМЕЧАНИЕ: кажется, что этот механизм расширения устарел и в конечном итоге будет удален: https://blogs.oracle.com/java-platform-group/entry/planning_safe_removal_of_under)
Ответы
Ответ 1
Вы можете переопределить аргумент "java.ext.dirs"
JVM, чтобы указать на какой-либо каталог приложения.
Я быстро протестировал переопределение JVM Argument со следующим классом, и он отлично работает.
$ ls /Library/Java/Extensions
extentionstest.jar
$
$java ExtentionTest
Main method executed fine.
$
$ java -Djava.ext.dirs=/home/pratapk/work/ ExtentionTest
Error: Could not find or load main class ExtentionTest
$
И следующий класс построен как extentionstest.jar
и скопирован в /Library/Java/Extensions
public class ExtentionTest {
public static void main(String args[] ) {
System.out.println("Main method executed fine.");
}
}
java.ext.dirs
поддерживает несколько каталогов, разделенных двоеточиями. В вашем случае JRE включен вместе с вашим приложением. Для вас гораздо проще включить путь lib/ext
, не включая "/Library/Java/Extensions"