What is the difference between JDK and JRE?
What is the difference between JDK and JRE?
What are their roles and when should I use one or the other?
The JRE is the Java Runtime Environment. It is a package of everything necessary to run a compiled Java program, including the Java Virtual Machine (JVM), the Java Class Library, the
java command, and other infrastructure. However, it cannot be used to create new programs.
The JDK is the Java Development Kit, the full-featured SDK for Java. It has everything the JRE has, but also the compiler (
javac) and tools (like
jdb). It is capable of creating and compiling programs.
Usually, if you only care about running Java programs on computer you will only install the JRE. It's all you need. On the other hand, if you are planning to do some Java programming, you need to install the JDK instead.
Sometimes, even if you are not planning to do any Java development on a computer, you still need the JDK installed. For example, if you are deploying a web application with JSP, you are technically just running Java programs inside the application server. Why would you need the JDK then? Because the application server will convert JSP into Java servlets and needs to use the JDK to compile the servlets. I am sure that there are more examples.
Read more... Read less...
The answer above (by Pablo) is very right. This is just additional information.
The JRE is, as the name implies, an environment. It's basically a bunch of directories with Java-related files, to wit:
bin/contains Java's executable programs. The most important is
java(and for Windows,
javawas well), which launches the JVM. There are some other utilities here as well, such as
conf/holds user-editable configuration files for Java experts to play with.
lib/has a large number of supporting files: some
.jars, configuration files, property files, fonts, translations, certs, etc. – all the "trimmings" of Java. The most important is
modules, a file that contains the
.classfiles of the Java standard library.
- At a certain level, the Java standard library needs to call into native code. For this purpose, the JRE contains some
.so(Linux) files under
lib/with supporting, system-specific native binary code.
The JDK is also a set of directories. It is a superset of the JRE, with some additions:
bin/has been enlarged with development tools. The most important of them is
javac; others include
jmods/, which holds JMOD files for the standard library, has been added. These files allow the standard library to be used with
JDK is a superset of JRE, and contains everything that is in JRE, plus tools such as the compilers and debuggers necessary for developing applets and applications. JRE provides the libraries, the Java Virtual Machine (JVM), and other components to run applets and applications written in the Java programming language.
In layman terms: JDK is grandfather JRE is father and JVM is their son. [i.e. JDK > JRE > JVM ]
JDK = JRE + Development/debugging tools
JRE = JVM + Java Packages Classes(like util, math, lang, awt,swing etc)+runtime libraries.
JVM = Class loader system + runtime data area + Execution Engine.
In other words if you are a Java programmer you will need JDK in your system and this package will include JRE and JVM as well but if you are normal user who like to play online games then you will only need JRE and this package will not have JDK in it.
The Java Virtual Machine (JVM) is the virtual machine that run the Java bytecodes. The JVM doesn't understand Java source code, that's why you compile your *.java files to obtain *.class files that contain the bytecodes understandable by the JVM. It's also the entity that allows Java to be a "portable language" (write once, run anywhere). Indeed there are specific implementations of the JVM for different systems (Windows, Linux, MacOS, see the wikipedia list..), the aim is that with the same bytecodes they all give the same results.
JDK and JRE
To explain the difference between JDK and JRE, the best is to read the Oracle documentation and consult the diagram :
Java Runtime Environment (JRE)
The Java Runtime Environment (JRE) provides the libraries, the Java Virtual Machine, and other components to run applets and applications written in the Java programming language. In addition, two key deployment technologies are part of the JRE: Java Plug-in, which enables applets to run in popular browsers; and Java Web Start, which deploys standalone applications over a network. It is also the foundation for the technologies in the Java 2 Platform, Enterprise Edition (J2EE) for enterprise software development and deployment. The JRE does not contain tools and utilities such as compilers or debuggers for developing applets and applications.
Java Development Kit (JDK)
The JDK is a superset of the JRE, and contains everything that is in the JRE, plus tools such as the compilers and debuggers necessary for developing applets and applications.
Note that Oracle is not the only one to provide JDK.
From Official java website...
JRE (Java Runtime environment):
- It is an implementation of the Java Virtual Machine* which actually executes Java programs.
- Java Runtime Environment is a plug-in needed for running java programs.
- The JRE is smaller than the JDK so it needs less Disk space.
- The JRE can be downloaded/supported freely from https://www.java.com
- It includes the JVM , Core libraries and other additional components to run applications and applets written in Java.
JDK (Java Development Kit)
- It is a bundle of software that you can use to develop Java based applications.
- Java Development Kit is needed for developing java applications.
- The JDK needs more Disk space as it contains the JRE along with various development tools.
- The JDK can be downloaded/supported freely from https://www.oracle.com/technetwork/java/javase/downloads/
- It includes the JRE, set of API classes, Java compiler, Webstart and additional files needed to write Java applets and applications.
One difference from a debugging perspective:
To debug into Java system classes such as String and ArrayList, you need a special version of the JRE which is compiled with "debug information". The JRE included inside the JDK provides this info, but the regular JRE does not. Regular JRE does not include this info to ensure better performance.
What is debugging information? Here is a quick explanation taken from this blog post:
Modern compilers do a pretty good job converting your high-level code, with its nicely indented and nested control structures and arbitrarily typed variables into a big pile of bits called machine code (or bytecode in case of Java), the sole purpose of which is to run as fast as possible on the target CPU (virtual CPU of your JVM). Java code gets converted into several machine code instructions. Variables are shoved all over the place – into the stack, into registers, or completely optimized away. Structures and objects don’t even exist in the resulting code – they’re merely an abstraction that gets translated to hard-coded offsets into memory buffers.
So how does a debugger know where to stop when you ask it to break at the entry to some function? How does it manage to find what to show you when you ask it for the value of a variable? The answer is – debugging information.
Debugging information is generated by the compiler together with the machine code. It is a representation of the relationship between the executable program and the original source code. This information is encoded into a pre-defined format and stored alongside the machine code. Many such formats were invented over the years for different platforms and executable files.