Почему простое изменение в rt.jar вызывает сбой среды выполнения Java без вывода сообщений? - PullRequest
2 голосов
/ 14 марта 2010

Вот что я делаю:

  1. извлечь содержимое моего JRE's rt.jar
  2. Извлеките src.zip из моего JDK (та же версия)

Теперь, если я скопирую Runtime.java из извлеченной папки src и скомпилирую его с помощью javac.exe без каких-либо изменений, а затем поместу его в извлеченную папку rt, чтобы, наконец, все вернуть в файл jar с помощью jar.exe, работает как положено. JRE работает нормально.

Однако, если я внесу малейшее изменение в Runtime.java, скомпилирую его и поместу в rt.jar, JRE вылетает всякий раз, когда я пытаюсь его запустить. Это пример небольшого изменения, которое вызывает тихий сбой:

/** Don't let anyone else instantiate this class */
    private Runtime() {
        System.out.println("This is a test.");
    }

Вместо:

/** Don't let anyone else instantiate this class */
    private Runtime() {}

Может кто-нибудь сказать мне, почему это приводит к сбою моей JRE?

Заранее спасибо.

Ответы [ 4 ]

7 голосов
/ 14 марта 2010

Возможно, что System.out не был инициализирован во время выполнения конструктора Runtime(). Обычно консольный вывод не считается «небольшим» изменением, но в неподходящее время он может вызвать слишком много вещей, которые еще могут быть не настроены.

2 голосов
/ 14 марта 2010

@ Том - я советую НЕ пытаться сделать это:

  • Вы не можете распространять измененный файл rt.jar без нарушения бинарной лицензии Sun.

  • Даже если вы это сделаете, вам не разрешат называть это Java.

  • Как вы обнаружили, при внесении изменений возникает много сложностей, особенно когда эти изменения могут мешать JVM за кулисами инициализации. И когда что-то взрывается во время инициализации, JVM часто не может сообщить о проблеме понятным способом.

  • Если вам удастся заставить измененный rt.jar работать для одной JRE, то нет гарантии, что те же хаки будут работать для другой версии.

  • Никто в здравом уме не будет сознательно использовать модифицированную JVM (особенно ту, которая была изменена сторонним разработчиком) в производственном приложении.

РЕДАКТИРОВАТЬ : судя по другим вашим вопросам, я полагаю, вы пытаетесь перепроектировать или модифицировать какое-либо стороннее Java-приложение с помощью специального средства запуска. Если вы предоставили больше информации о том, что вы действительно пытались сделать, мы могли бы предложить правильный способ сделать это ... вместо того, чтобы использовать «отчаянные меры», такие как изменение JRE.

2 голосов
/ 14 марта 2010

Вы все делаете неправильно. Вы не можете распространять этот измененный JRE для начала, поэтому он полезен только внутри вашей организации. Установите SecurityManager и не предоставляйте своей кодовой базе какие-либо разрешения RuntimePermissions, от которых вы пытаетесь защитить.

1 голос
/ 14 марта 2010

Это довольно странно, так как я делал один и тот же трюк со многими классами в rt.jar в прошлом.

Можете ли вы предоставить нам выходные данные аварийного процесса?

...