2015-05-24 3 views
14

Наш продукт представляет собой автономное настольное приложение OS X, написанное на Java. Мы включили встроенную JRE для запуска нашего программного обеспечения.Как отключить механизм расширения Java

Правила для запуска 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

Я думаю, вы можете указать -Djava.ext.dir указывать на безопасное место. Не уверен, что это работает с Mac-пусковой установкой, он работал на Windows. – eckes

+0

Вы имеете в виду, что вы упаковали встроенную JRE в ** ваш собственный файл jar? Как вы упаковываете/включаете встроенную JRE? –

+0

У меня нет полного ответа. Первое, что приходит мне на ум, - это изменение правил безопасности JRE. Классы будут загружены несколькими вызовами метода loadClass, поведение загрузки зависит от политик безопасности. –

ответ

7

Вы можете переопределить "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"

+0

Это достигает того, что я просил. Однако, пытаясь, кажется, что механизм расширения в настоящее время имеет решающее значение для загрузки nashorn и JavaFx. Мы должны иметь возможность предотвратить использование только папки/usr/lib/java; должна быть включена встроенная папка lib/ext JRE. –

+0

java.ext.dirs поддерживает несколько каталогов, разделенных двоеточиями. В вашем случае JRE включен вместе с вашим приложением, поэтому вам гораздо проще включить путь lib/ext, не включая «/ Library/Java/Extensions», –

Смежные вопросы