Как стать автором
Обновить

Собираем debug-версию rt.jar

Время на прочтение 3 мин
Количество просмотров 5.5K
Зачем это нужно?

Чтоб вместо такого:

image

при отладке стандартной библиотеки Java видеть такое>>


image

Делал на основе подходов, описанных по ссылкам:

www.javalobby.org/java/forums/t103334.html
forums.sun.com/thread.jspa?threadID=428018&tstart=1620
www.javalobby.org/java/forums/t19866.html

Как? В двух словах: перекомпилировать src.zip из JDK с указанием опции компилятор -g.

Необходимые условия: установленные JDK & python.

По шагам. Создаём где-нибудь пустую папочку, для определенности D:/rt_debug, разархивируем в неё src.zip и rt.jar из вашей инсталляции JDK. Я проделывал эту процедуру со свежеустановленной jdk-6u20. Таким образом, у вас в D:/rt_debug обраузется 2 папки D:/rt_debug/rt и D:/rt_debug/src. Создаём в этой же папке скрипт gen_compile_files_list.py следующего содержания:

from os import walk
from os.path import join

def find(path, ext):
  for dir, _, files in walk(path):
    for f in files:
      if f.endswith(ext):
        yield join(dir, f)

#print '\n'.join(find('src', '.java'))

def go():
  src_files = list(find('src', '.java'))
  rt_files = list(find('rt', '.class'))
  
  n_src = len(src_files)
  n_rt = len(rt_files)
  
  print 'java files:', n_src
  print 'rt files:', n_rt
  
  src_files=[s[4:-5] for s in src_files] # src/qqq.java -> qqq
  rt_files = set([s[3:-6] for s in rt_files ]) # rt/qqq.class -> qqq

  out = open("to_compile.txt", "w")

  to_compile = 0
  obsolete = 0

  for j in src_files:
    f = "%s.java\n" % j
    if j in rt_files:
      out.write(f)
      to_compile += 1
    else:
      #print "Obsolete: ", f
      obsolete += 1
      
  print 'will compile:', to_compile
  print 'obsolete:', obsolete
      
  out.close()
  
go()  

* This source code was highlighted with Source Code Highlighter.


Этот код сгенерит компилящийся список .java-файлов в файле to_compile.txt. Дело в том, что src.zip как оказалось имеет некоторые исходники, которых нет в rt.jar (так думаю, для обратной совместимости?), наличие которых ломает компиляцию.

После запуска скрипта у вас появится файл to_compile.txt. Затем, создаём файл c.bat следующего содержания (поправьте пути на ваш java_home):

@echo off

set JH=C:/Program Files/Java/jdk1.6.0_20
set VER=1.6

if not exist classes (
  echo Creating classes dir
  mkdir classes
)

echo Compiling...

cd src
"%JH%\bin\javac" -nowarn -g -d ../classes -J-Xmx512m -classpath ../rt -source %VER% -target %VER% @../to_compile.txt 2>../error.log

echo Creating jar...

cd ../classes
"%JH%\bin\jar" -cf ../rt-dbg.jar *

cd ..

echo Done.


* This source code was highlighted with Source Code Highlighter.


или же, если Вы — пользователь линукса, то c.sh содержанием:

JH="C:/Program Files/Java/jdk1.6.0_20"
VER=1.6

if ! [ -d classes ]; then
  echo Creating classes dir
  mkdir classes
fi

echo Compiling...

cd src
"$JH\bin\javac" -nowarn -g -d ../classes -J-Xmx512m -classpath ../rt -source $VER -target $VER @../to_compile.txt 2>../error.log

echo Creating jar...

cd ../classes
"$JH\bin\jar" -cf ../rt-dbg.jar *

echo Done.


* This source code was highlighted with Source Code Highlighter.


(скрипт тестировался на MSYS).

В результате, если всё пойдет хорошо (проверьте error.log в самом конце, там должны быть только warning'и), вы получите файл rt-dbg.jar в той же директории.

Затем, чтоб заставить java'у использовать классы из этой сборки, надо запускать её с ключиком

-Xbootclasspath/p:D:/rt_debug/rt-dbg.jar

По ссылкам выше говорят, что можно закидывать в endosed директорию вашей инсталляции Java, но у меня этот путь не работал.

Приведенный выше код можно скачать по ссылке.
UPD. rt-dbg.jar (17 мб)
Теги:
Хабы:
+17
Комментарии 16
Комментарии Комментарии 16

Публикации

Истории

Работа

Java разработчик
356 вакансий

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн