2015-05-24 12 views
14

Nasz produkt to samodzielna aplikacja komputerowa OS X napisana w Javie. Dołączamy środowisko JRE do uruchomienia naszego oprogramowania.Jak wyłączyć mechanizm rozszerzenia Java

Zasady uruchamiania JRE wydają się umieszczać żadnych plików JAR w /usr/lib/java, /Library/Java/Extensions i ~/Library/Java/Extensions na ścieżce klasy przed bibliotekami jawnie obejmują na ścieżce klasy.

Jeśli użytkownik ma jakiekolwiek pliki JAR w dowolnym folderze mechanizmu rozszerzenia Java, to te pliki JAR zostaną dodane do naszej ścieżki klas. Niedawny incydent pomocy technicznej pojawił się, ponieważ klient miał starszą wersję krytycznej biblioteki firm trzecich w /usr/lib/java - to powodowało nieoczekiwane awarie oprogramowania podczas uruchamiania.

Nie potrafiłem określić, w jaki sposób mogę wyłączyć ten mechanizm rozszerzenia podczas wywoływania środowiska JRE osadzonego w naszej aplikacji. Jak mogę to zrobić?

─────────
UWAGA: wydaje się, że ten mechanizm rozszerzenie jest przestarzała i ostatecznie zostaną usunięte: https://blogs.oracle.com/java-platform-group/entry/planning_safe_removal_of_under)

+1

myślę, że można określić -Djava.ext.dir zwrócić się do bezpiecznego miejsca. Nie jestem pewien, czy działa to z programem uruchamiającym Maca, działało w systemie Windows. – eckes

+0

Masz na myśli pakowanie osadzonego środowiska JRE w ** swoim ** własnym pliku JAR? W jaki sposób pakujesz/dołączasz osadzone środowisko JRE? –

+0

Nie mam pełnej odpowiedzi. Pierwszą rzeczą, która przychodzi mi do głowy, jest modyfikowanie zasad bezpieczeństwa JRE. Klasy będą ładowane kilkoma wywołaniami metody loadClass, zachowanie ładowania zależy od zasad bezpieczeństwa. –

Odpowiedz

7

Można zastąpić argument "java.ext.dirs" JVM, aby wskazywał na pewne katalog aplikacji.

Szybko przetestowałem przesłonięcie argumentu JVM za pomocą następującej klasy i działa dobrze.

$ 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 
$ 

I dodaje klasa jest zbudowany jako extentionstest.jar i kopiowane na /Library/Java/Extensions

public class ExtentionTest { 
    public static void main(String args[]) { 
     System.out.println("Main method executed fine."); 
    } 
} 

java.ext.dirs obsługuje wiele katalogu jako oddzielone dwukropkiem. W twoim przypadku JRE jest zawarty wraz z aplikacją, jest o wiele łatwiej można zawierać ścieżkę lib/ext natomiast nie w tym "/Library/Java/Extensions"

+0

Osiąga to, o co prosiłem. Jednak po wypróbowaniu tego, wydaje się, że mechanizm rozszerzenia jest obecnie krytyczny dla ładowania nashorn i JavaFx. Musimy być w stanie zapobiec używaniu tylko folderu/usr/lib/java; Wbudowany folder JRE lib/ext musi być dołączony. –

+0

java.ext.dirs obsługuje wiele katalogów rozdzielonych dwukropkiem. W twoim przypadku JRE jest dołączony wraz z twoją aplikacją, więc znacznie łatwiej jest ci dołączyć ścieżkę do lib/ext, nie uwzględniając "/ Library/Java/Extensions" –

Powiązane problemy