1. Определение

JRE(Java Runtime Enviroment)Это среда выполнения для Java. Она предназначена для пользователей Java-программ, а не для разработчиков. Если вы скачаете и установите только JRE, то ваша система сможет только запускать Java-программы. JRE — это набор сред, необходимых для запуска Java-программ, включая стандартную реализацию JVM и основные библиотеки классов Java. В него входят виртуальная машина Java, основные классы платформы Java и вспомогательные файлы. В него не входят инструменты разработки (компилятор, отладчик и т. д.).

JDK (Java Development Kit), также известный как J2SDK (Java2 Software Development Kit), — это комплект для разработки на Java. Он предоставляет среду разработки Java (предоставляя такие инструменты, как компилятор javac, используемый для компиляции java-файлов в class-файлы) и среду выполнения (предоставляя JVM и вспомогательные пакеты Runtime, используемые для разбора class-файлов, чтобы их можно было запустить). Если вы скачаете и установите JDK, вы сможете не только разрабатывать Java-программы, но и получите платформу для запуска Java-программ. JDK — это ядро всей Java, включающее среду выполнения Java (JRE), набор инструментов Java tools.jar и стандартную библиотеку классов Java (rt.jar).

2. Разница

JRE в основном содержит: файлы классов библиотеки классов Java (все упакованы в jar-файлы в каталоге lib) и виртуальную машину (jvm.dll); JDK в основном содержит: файлы классов библиотеки классов Java (все упакованы в jar-файлы в каталоге lib) и поставляется с собственной JRE. Так почему же JDK поставляется с собственной JRE? Кроме того, и папка client, и папка server в jdk/jre/bin содержат jvm.dll (это означает, что JRE, поставляемая с JDK, имеет две виртуальные машины).

Помните, как задавали путь jdk/bin в переменной среды path?Учитель скажет всем, что без этого нельзя использовать javac и java. Действительно, в каталоге jdk/bin находятся все команды. Но задумывался ли кто-нибудь, что команда java, которую мы используем, находится не в каталоге jdk/bin, а в каталоге jre/bin? Если не верите, можно провести эксперимент: вырежьте java.exe из каталога jdk/bin в другое место и снова запустите программу на Java. Что вы обнаружили? Всё работает! (В JRE нет команды javac, причина проста: это не среда разработки.) Тогда кто-то может спросить: я ведь явно не задавал каталог jre/bin в переменной среды? Подумайте: если Java должна быть доступна большинству людей, им не нужен JDK для разработки; им нужна только JRE, чтобы запускать программы на Java. Тогда каждому клиенту всё равно пришлось бы вручную настраивать переменные среды — как это хлопотно! Поэтому при установке JRE установщик автоматически добавляет java.exe из JRE в системные переменные. Способ проверки очень прост: зайдите в Windows/system32 и посмотрите. Что вы обнаружили? Там есть java.exe.

3. Трудности

Если вы установите JDK, вы обнаружите, что на вашем компьютере есть два набора JRE: один расположен в C:\\Program Files\\Java\\jre6, а другой расположен вC:\\Program Files\\Java\\jdk1.6.0_41\\jre каталоге.

Роль JRE подобна роли ПК. Нашим написанным Win32-приложениям нужна операционная система, чтобы помочь нам их запускать; аналогично, нашим написанным Java-программам также нужна JRE для запуска. Поэтому после установки JDK, если два комплекта JRE установлены в двух разных местах на жёстком диске, можно представить, что на вашем компьютере есть два виртуальных Java-ПК, оба способны запускать Java-программы. Так что можно сказать: пока на вашем компьютере установлена JRE, он может корректно запускать Java-приложения.

1. Почему Sun сделала так, что JDK устанавливает две одинаковые JRE?

Это потому, что JDK содержит множество инструментов разработки, написанных на Java, таких как javac.exe, jar.exe и т. д. Эти команды размещены в каталоге C:\Program Files\Java\jdk1.6.0_41\bin.

Поскольку это команды, написанные на Java, они должны полагаться на jar-пакеты Java. Эти jar-пакеты хранятся вC:\Program Files\Java\jdk1.6.0_41\libкаталоге.

Если в каталоге C:\Program Files\Java\jdk1.6.0_41\lib\ переименовать tools.jar в tools1.jar, а затем запустить javac.exe, отображается следующий результат:

Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/tools/javac /Main 

Но если вы введёте:

java -cp C:\Program Files\Java\jdk1.6.0_41\lib\tools1.jar com.sun.tools.javac.Mainx

Вы получите тот же результат, что и с javac.exe.

Отсюда мы можем доказать, что javac.exe — это всего лишь обёртка (Wrapper), и она сделана, чтобы избавить разработчиков от ввода слишком длинных команд.

Более того, мы можем обнаружить, что программы в каталоге C:\Program Files\Java\jdk1.6.0_41\bin очень малы, не больше 29K. Отсюда можно сделать вывод: инструменты в JDK почти все написаны на Java, поэтому они также являются Java-приложениями. Следовательно, чтобы использовать инструменты, входящие в JDK, для разработки Java-программ, необходимо также включить JRE. Таким образом, JRE в каталоге C:\Program Files\Java\jdk1.6.0_41\jre используется для запуска обычных Java-программ.

2. Если на компьютере установлено две или более JRE, кто решает?

Эта важная задача ложится на java.exe. Задача java.exe — найти подходящую JRE для запуска программы на Java. java.exe ищет JRE в следующем порядке: есть ли JRE в его собственном каталоге; есть ли JRE в родительском каталоге; запрос к реестру:

[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment] 

Поэтому результат работы java.exe во многом зависит от того, какая JRE на вашем компьютере запускается.

Источник статьи: http://swiftlet.net/archives/639