20

Goal: check java's version on a machine (I can get this from java -version). Compare it with latest available from java website

I would like to know if there is any way I can check for latest Java releases assuming that I have JRE/JDK installed on a machine.

If I can do this through Java itself, my solution would become platform independent. I could use java.net.URL class to send a request to Java website and get the HTML, however the response would be dynamic as Oracle can change their website and styles and possibly will have maintenance issues in long run.

I have looked at javatester.org, but I would not want it through an applet but through command line (which I can add to a script).

Through javacpl.exe, I can schedule periodic checks, but I would like to do it on demand.

Cœur
  • 37,241
  • 25
  • 195
  • 267
Chris
  • 5,584
  • 9
  • 40
  • 58
  • 1
    "but through command line"? Which command line? You want a bash script for it, or a Windows batch script, or whatever? Please be more specific. – gexicide Oct 18 '12 at 10:40
  • I dont understand. You want this only for your local machine or you want a script for updating computers on the ethernet ? – Alexander.Iljushkin Oct 18 '12 at 10:42
  • @gexicide I wanted to know if there is any way I can do this through java itself to make it platform independent. For now, I'm looking for windows only. So windows batch script can serve the purpose for now. – Chris Oct 18 '12 at 10:45
  • Do you mean [this](http://stackoverflow.com/questions/11079831/checking-the-version-of-jre-used-during-run-time?rq=1)? – Piotr Gwiazda Oct 18 '12 at 10:46
  • @AutoCoder I want to write a script which when executed in a machine does this work. Network adminstration is not the part of my question. For now I want it to run from my local machine – Chris Oct 18 '12 at 10:46
  • @PeterRader Please assume internet connection with no firewall problems or Proxy problems – Chris Oct 18 '12 at 10:48
  • @Chris, you can make a script. There are no ftp storage like of google for instanse. So you should update your script every time when html is changed. it is standart problem of coding parsers. you can't make a parser for unlimited time. And this is really bad. Oracle should be more client-oriented. ftp with java versions would be great thing. – Alexander.Iljushkin Oct 18 '12 at 13:10
  • @Chris, and thank you for downvote. I hope i didn't helped you with your extremely important problem. – Alexander.Iljushkin Oct 18 '12 at 13:22

9 Answers9

19

The answer is actually quite simple. http://java.com/en/download/testjava.jsp issues a request to http://java.com/applet/JreCurrentVersion2.txt. That file currently contains a single version number: '1.7.0_11'...which is the latest and greatest, indeed.

Java code example

try (BufferedReader br = new BufferedReader(new InputStreamReader(new URL(
    "http://java.com/applet/JreCurrentVersion2.txt").openStream()))) {
  String fullVersion = br.readLine();
  String version = fullVersion.split("_")[0];
  String revision = fullVersion.split("_")[1];
  System.out.println("Version " + version + " revision " + revision);
} catch (IOException e) {
  // handle properly
}

Update 2014-03-20

Eventhough Java 8 was recently released http://java.com/applet/JreCurrentVersion2.txt currently still returns 1.7.0_51.

Update 2016-07-13

Looks like we need to come back to this every few months... Currently you need to scan http://java.com/en/download/installed8.jsp for a JavaScript variable latest8Version. So, you could run curl -s https://java.com/en/download/installed8.jsp | grep latest8Version.

Update 2018-08-19

http://javadl-esd-secure.oracle.com/update/baseline.version is another hot spot as mentioned in some other answer.

Marcel Stör
  • 22,695
  • 19
  • 92
  • 198
11

An URL very similar to the now defunct "JreCurrentVersion2.txt":

http://javadl-esd-secure.oracle.com/update/baseline.version

The contents of the link look like this:

1.8.0_111
1.7.0_121
1.6.0_131
1.5.0_99
1.4.2_43

You can easily parse the contents to find the latest JRE versions.

Juck Keng Lam
  • 111
  • 1
  • 3
  • 1
    While this link may answer the question, it is always best to provide the key information from the URL in your answer. This serves two purposes: (i) it saves users the trouble of visiting the external link and searching for what you wanted them to see, and (ii) the information is always available in your answer even if the link stops working. Please edit your answer and include the key information. Thanks. – Ishita Sinha Oct 20 '16 at 04:22
  • @Ishita Sinha: Thanks for your comments. However, for this case, it is all about the external link being there :) – Juck Keng Lam Oct 21 '16 at 04:21
  • This file references version numbers which are not publicly available though . For example 1.7.0_121 vs 1.7.0_80. "Updates for Java SE 7 released after April 2015, and updates for Java SE 6 released after April 2013 are only available to Oracle Customers" – Antoine Cotten Jan 16 '17 at 23:14
  • Is there also an link for newest openjdk version? – SkateScout Mar 23 '21 at 11:30
9

UPDATE: I don't recommend this method because this JRE is the one that has the Ask.com toolbar. You're better off downloading it yourself and distributing it yourself.

The jusched.exe program accesses the following URL to find out what versions are available. I think it's less likely to change because jusched is installed on millions of computers.

https://javadl-esd-secure.oracle.com/update/1.7.0/map-m-1.7.0.xml

Here is a snippet of what it returns for me:

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes" ?>

<java-update-map version="1.0">
      <mapping>
      <version>1.7.0_17</version>
      <url>https://javadl-esd-secure.oracle.com/update/1.7.0/au-descriptor-1.7.0_25-b17.xml</url>
   </mapping>
   <mapping>
      <version>1.7.0_21</version>
      <url>https://javadl-esd-secure.oracle.com/update/1.7.0/au-descriptor-1.7.0_25-b17.xml</url>
   </mapping>
   </java-update-map>

To get the actual version that it is pointing to you have to fetch the above URL. Here is another snippet of what this XML looks like:

xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- XML file to be staged anywhere, and pointed to by map.xml file -->
<java-update>
  <information version="1.0" xml:lang="en">
    <caption>Java Update - Update Available</caption>
    <title>Java Update Available</title>
    <description>Java 7 Update 25 is ready to install. Installing Java 7 Update 25 might uninstall the latest Java 6 from your system. Click the Install button to update Java now.  If you wish to update Java later, click the Later button.</description>
    <moreinfo>http://java.com/moreinfolink</moreinfo>
    <AlertTitle>Java Update Available</AlertTitle>
    <AlertText>A new version of Java is ready to be installed.</AlertText>
    <moreinfotxt>More information...</moreinfotxt>
    <url>http://javadl.sun.com/webapps/download/GetFile/1.7.0_25-b17/windows-i586/jre-7u25-windows-i586-iftw.exe</url>
    <version>1.7.0_25-b17</version>
    <post-status>https://nometrics.java.com</post-status>
    <cntry-lookup>http://rps-svcs.sun.com/services/countrylookup</cntry-lookup>
    <predownload></predownload>
    <options>/installmethod=jau FAMILYUPGRADE=1 SPWEB=http://javadl-esd.sun.com/update/1.7.0/sp-1.7.0_25-b17</options>
    <urlinfo>24595ec7f861bc67e572f1e4ad3992441335e1a7</urlinfo>
  </information>
</java-update>

The version tag contains the full version number.

Sarel Botha
  • 12,419
  • 7
  • 54
  • 59
4

You could parse the Java SE Downloads page to extract the Java versions.
That way, you get the version of both JDK6 and JDK7, which allows you to test your particular JDK (6 or 7) against the latest Oracle one.
(As opposed to the Free Java Download page, which only lists the JDK7)

Her is a crude script in Go, which you can compile on Windows, Unix, MacOs into a single independent executable, and use within a command line or a script:

package main

import (
    "bytes"
    "encoding/xml"
    "fmt"
    "io/ioutil"
    "net/http"
    "os/exec"
    "regexp"
)

type Jdk struct {
    Url    string
    Ver    string
    update string
}

func main() {
    resp, err := http.Get("http://www.oracle.com/technetwork/java/javase/downloads/index.html")
    if err != nil {
        fmt.Printf("Error on http Get: %v\n", err)
        return
    }
    bodyb, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Printf("QueriesForOwner: error in ReadAll: %v\n", err)
        return
    }
    br := bytes.NewBuffer(bodyb)
    jdkre, err := regexp.Compile(`h3[^\r\n]+(/technetwork/java/javase/downloads/(jdk(?:6|7)(?:u(\d+))?)-downloads-\d+\.html)`)
    if err != nil {
        fmt.Printf("extract: error in regexp compilation: %v\n", err)
        return
    }
    jdks := jdkre.FindAllSubmatch(br.Bytes(), -1)
    jdk7 := Jdk{string(jdks[0][4]), string(jdks[0][5]), string(jdks[0][6])}
    jdk6 := Jdk{string(jdks[1][7]), string(jdks[1][8]), string(jdks[1][9])}
    fmt.Printf("Jdk7: %v\nJdk6: %v\n", jdk7, jdk6)
    jver, err := exec.Command("java", "-version").CombinedOutput()
    if err != nil {
        fmt.Printf("*ExitError from java -version:", err)
        return
    }
    fmt.Println("JVer: '", string(jver), "'")
    jverre, err := regexp.Compile(`1.(\d).\d(?:_(\d+))"`)
    jvers := jverre.FindSubmatch(jver)
    jj := string(jvers[0])
    jv := string(jvers[1])
    ju := string(jvers[2])
    jdk := jdk6
    if jv == "7" {
        jdk = jdk7
    }
    if jdk.update != ju {
        fmt.Println("Local JDK *NOT* up-to-date: you have ", jj, ", Oracle has ", jdk.Ver)
    } else {
        fmt.Println("Local JDK *up-to-date*: you have ", jj, ", equals to Oracle, which has", jdk.Ver)
    }
}

Again, this is a crude script, oriented toward JDK, and you would need to adapt it to your specific need, making its output and exit status match what you need for your script.

On my (PC) workstation, it returns:

Jdk7: {/technetwork/java/javase/downloads/jdk7u9-downloads-1859576.html jdk7u9 9}
Jdk6: {/technetwork/java/javase/downloads/jdk6u37-downloads-1859587.html jdk6u37 37}
JVer: ' java version "1.6.0_31"
Java(TM) SE Runtime Environment (build 1.6.0_31-b05)
Java HotSpot(TM) Client VM (build 20.6-b01, mixed mode, sharing)
 '
Local JDK *NOT* up-to-date: you have  1.6.0_31" , Oracle has  jdk6u37
VonC
  • 1,262,500
  • 529
  • 4,410
  • 5,250
  • Note: I initially tried to parse the xml for the "Java SE Downloads" page... it failed on an `XML syntax error on line 169: element closed by `. What a shame ;) – VonC Oct 18 '12 at 13:31
  • That's why I used the TagSoup parser (without even trying to parse the xml) ;-) – jalopaba Oct 18 '12 at 13:45
2

I don't know what information you are exactly looking for, but you can get some version information using

System.getProperty("java.version");

If this is not what you're looking for, check the other available properties here: http://docs.oracle.com/javase/6/docs/api/java/lang/System.html#getProperties()

As for the latest available version, I guess you'd have to parse this site manually: http://java.com/en/download/index.jsp

The latest version is on there, currently it's

Version 7 Update 9

You write that this is not what you want because "Oracle can change their website and styles". However, you want to find out the latest version of Java by accessing their service (website in this case). As long as you're not paying for this, they have no obligation to you, and can change the service whenever they want without your consent. And even when you're a paying customer, the best you can hope for is that they will inform you of upcoming changes, and your maintenance issues will remain.

Remember, it's THEIR service you want to use.

Gijs Overvliet
  • 2,643
  • 3
  • 28
  • 35
  • As I said, I want to compare the version of Java in my machine with the lastest available in oracle website. `System.getProperty("java.version");` gives me the installed version of java. – Chris Oct 18 '12 at 10:53
  • OP already stated that he knows how to get machines java version, he wants to know most up to date java version from web. – brimborium Oct 18 '12 at 10:59
1

I have solved a similar issue some time ago with this groovy script (disclaimer: is somehow a "toy" script):

@Grapes([
    @Grab(group='org.ccil.cowan.tagsoup', module='tagsoup', version='1.2.1')
])

def slurper = new XmlSlurper(new org.ccil.cowan.tagsoup.Parser())
def url = new URL("http://www.java.com/download/manual.jsp")

def html
url.withReader { reader ->
    html = slurper.parse(reader)
}
def lastJava = html.body.div.div.div.strong.text()

println "Last available java version: ${lastJava}"
println "Currently installed java version: ${System.properties["java.version"]}"

It yields something like:

Last available java version: 
Version 7 Update 9

Currently installed java version: 1.7.0_07

If you want to avoid maintenance issues due to changes to the page structure, maybe a better option is to search for a line containing "Version x Update y".

jalopaba
  • 8,039
  • 2
  • 44
  • 57
1

To get all system variables

Properties properties = System.getProperties();
System.out.println(properties);

Sample output, this might be different in your system depending on your OS and Java JDK/JRE version.

{
    java.runtime.name = Java(TM) SE Runtime Environment,
    sun.boot.library.path = C:\Program Files\Java\jdk1.8.0_31\jre\bin,
    java.vm.version = 25.31-b07,
    java.vm.vendor = Oracle Corporation,
    java.vendor.url = http://java.oracle.com/,
    path.separator = ;,
    idea.launcher.port = 7534,
    java.vm.name = Java HotSpot(TM) 64-Bit Server VM,
    file.encoding.pkg = sun.io,
    user.country = NP,
    user.script = ,
    sun.java.launcher = SUN_STANDARD,
    sun.os.patch.level = ,
    java.vm.specification.name = Java Virtual Machine Specification,
    user.dir = C:\Users\...\roid,
    java.runtime.version = 1.8.0_31-b13,
    java.awt.graphicsenv = sun.awt.Win32GraphicsEnvironment,
    java.endorsed.dirs = C:\Program Files\Java\jdk1.8.0_31\jre\lib\endorsed,
    os.arch = amd64,
    java.io.tmpdir = C:\Windows\TEMP\,
    line.separator = ,
    java.vm.specification.vendor = Oracle Corporation,
    user.variant = ,
    os.name = Windows 8.1,
    sun.jnu.encoding = Cp1252,
    java.library.path = C:\Program...roid,
    java.specification.name = Java Platform API Specification,
    java.class.version = 52.0,
    sun.management.compiler = HotSpot 64-Bit Tiered Compilers,
    os.version = 6.3,
    user.home = C:\Users\Xxx,
    user.timezone = Asia/Kathmandu,
    java.awt.printerjob = sun.awt.windows.WPrinterJob,
    file.encoding = UTF-8,
    idea.launcher.bin.path = C:\Program Files (x86)\xxx\bin,
    java.specification.version = 1.8,
    java.class.path = C:\Program Files\Java\jdk1.8.0_31\jre\lib\charsets.jar;...,
    user.name = Xxx,
    java.vm.specification.version = 1.8,
    sun.java.command = com.xxxx.ameras,
    java.home = C:\Program Files\Java\jdk1.8.0_31\jre,
    sun.arch.data.model = 64,
    user.language = en,
    java.specification.vendor = Oracle Corporation,
    awt.toolkit = sun.awt.windows.WToolkit,
    java.vm.info = mixed mode,
    java.version = 1.8.0_31,
    java.ext.dirs = C:\Program Files\Java\jdk1.8.0_31\jre\lib\ext;...,
    java.vendor = Oracle Corporation,
    file.separator = \,
    java.vendor.url.bug = http://bugreport.sun.com/bugreport/,
    sun.io.unicode.encoding = UnicodeLittle,
    sun.cpu.endian = little,
    sun.desktop = windows,
    sun.cpu.isalist = amd64
}

Retrive only specific variable

String javaVersion = System.getProperty("java.version");
System.out.println(javaVersion);

Output

1.8.0_31
Madan Sapkota
  • 25,047
  • 11
  • 113
  • 117
0

@MarcelStör's solution no longer works - the version in the file is 1.8.0_51, while the actual latest version is 1.8.0_91/92. If you go to the Java test page in Firefox or Chrome and open the development console you can get the variable latest8Version which currently is 1.8.0_91. This could be wrapped in a Selenium/Firefox solution, but is an incredibly hacky way of getting this information.

Community
  • 1
  • 1
l0b0
  • 55,365
  • 30
  • 138
  • 223
  • I updated my answer a month ago. You may now run `curl -s http://java.com/en/download/installed8.jsp | grep latest8Version` – Marcel Stör Aug 12 '16 at 21:18
-1
System.getProperty("java.vm.specification.version");
System.getProperty("java.version");
nhahtdh
  • 55,989
  • 15
  • 126
  • 162
Vishal Chaudhari
  • 403
  • 1
  • 6
  • 13