Переопределение отдельных классов из rt.jar - PullRequest
4 голосов
/ 08 декабря 2011

Я ищу удобный способ переопределить класс из пути к классу начальной загрузки, rt.jar. Причина в ошибке OpenJDK7 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7104625

Исправление этой ошибки - тривиальное (см. Связанный пост в списке рассылки) изменение на sun.awt.X11.XComponentPeer. Поэтому мне было интересно, есть ли простой способ переопределить только этот затронутый класс в моем classpath, без необходимости перепаковывать / перестраивать rt.jar (чтобы исправление не потерялось при следующем автоматическом обновлении OpenJDK).

В идеале, это также повлияет на Eclipse ...

Я предполагаю, что java -Djava.system.class.loader=myClassLoader будет работать? Есть ли другой способ переопределить один класс с таким «исправлением»? (Примечание: не используется в моем собственном коде, но глубоко в коде Java AWT)

Ответы [ 4 ]

9 голосов
/ 08 декабря 2011

Вы можете использовать параметр VM -Xbootclasspath/p, чтобы добавить собственный JAR-файл с пропатченным классом к пути к загрузочному классу.

1 голос
/ 08 декабря 2011

Я думаю, вы можете попытаться использовать javaagent Вы должны перехватить событие, когда JVM загрузит системный класс и поменяет его на свой

1 голос
/ 08 декабря 2011

Я считаю, что единственный поддерживаемый способ сделать это - "исправить" файл rt.jar, заменив нужный файл * .class.7-Zip может помочь вам легко это сделать.

Именно так Oracle предоставила свое исправление двойного анализа с помощью инструмента FPUpdater, который по сути был скриптом, который делал именно это.( Немного истории .)

0 голосов
/ 08 декабря 2011

Я думаю, что @ziesemer верен, но вы можете использовать загрузчик классов, чтобы заменить класс-нарушитель, когда ваше приложение загружается. Это может быть чище, если вы не хотите беспокоиться об обновлении JDK под вами, хотя вам придется вставлять этот код начальной загрузки загрузчика классов в каждое приложение, над которым вы работаете.

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