Java以编程方式检查最新版本

目标 :检查机器上的java版本(我可以从java -version )。 将其与java网站上的最新版本进行比较

我想知道是否有任何方法可以检查最新的Java版本,假设我在一台机器上安装了JRE / JDK。

如果我可以通过Java本身做到这一点,我的解决方案将变得与平台无关。 我可以使用java.net.URL类向Java网站发送请求并获取HTML,但是响应将是动态的,因为Oracle可以更改其网站和样式,并且可能长期存在维护问题。

我查看了javatester.org ,但我不希望它通过applet而是通过命令行(我可以添加到脚本中)。

通过javacpl.exe,我可以安排定期检查,但我想按需进行。

答案其实很简单。 http://java.com/en/download/testjava.jsp向http://java.com/applet/JreCurrentVersion2.txt发出请求。 该文件目前包含一个版本号:’1.7.0_11’……这是最新的,也是最好的。

Java代码示例

 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 } 

更新2014-03-20

尽管Java 8最近发布了 http://java.com/applet/JreCurrentVersion2.txt目前仍然返回1.7.0_51。

更新2016-07-13

看起来我们需要每隔几个月回到这个……目前你需要扫描http://java.com/en/download/installed8.jsp以获取JavaScript变量latest8Version 。 所以,你可以运行curl -s https://java.com/en/download/installed8.jsp | grep latest8Version curl -s https://java.com/en/download/installed8.jsp | grep latest8Version

更新2018-08-19

http://javadl-esd-secure.oracle.com/update/baseline.version是其他一些答案中提到的另一个热点。

更新:我不推荐这种方法,因为这个JRE是具有Ask.com工具栏的JRE。 你最好自己下载并自己发布。

jusched.exe程序访问以下URL以找出可用的版本。 我认为它不太可能改变,因为jusched安装在数百万台计算机上。

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

以下是它为我返回的内容片段:

    1.7.0_17 https://javadl-esd-secure.oracle.com/update/1.7.0/au-descriptor-1.7.0_25-b17.xml   1.7.0_21 https://javadl-esd-secure.oracle.com/update/1.7.0/au-descriptor-1.7.0_25-b17.xml   

要获取它指向的实际版本,您必须获取上述URL。 这是此XML的另一个片段:

 xml version="1.0" encoding="UTF-8" standalone="yes"?>    Java Update - Update Available Java Update Available 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. http://java.com/moreinfolink Java Update Available A new version of Java is ready to be installed. More information... http://javadl.sun.com/webapps/download/GetFile/1.7.0_25-b17/windows-i586/jre-7u25-windows-i586-iftw.exe 1.7.0_25-b17 https://nometrics.java.com http://rps-svcs.sun.com/services/countrylookup  /installmethod=jau FAMILYUPGRADE=1 SPWEB=http://javadl-esd.sun.com/update/1.7.0/sp-1.7.0_25-b17 24595ec7f861bc67e572f1e4ad3992441335e1a7   

版本标记包含完整版本号。

一个非常类似于现在已经不存在的“JreCurrentVersion2.txt”的URL:

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

链接的内容如下所示:

 1.8.0_111 1.7.0_121 1.6.0_131 1.5.0_99 1.4.2_43 

您可以轻松解析内容以查找最新的JRE版本。

您可以解析Java SE下载页面以解压缩Java版本。
这样,您就可以获得JDK6和JDK7的版本,它允许您针对最新的Oracle JDK测试您的特定JDK(6或7)。
(与仅列出JDK7的Free Java Download页面相对)

她是Go中粗略脚本,你可以在Windows,Unix,MacO上编译成一个独立的可执行文件,并在命令行或脚本中使用:

 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) } } 

同样,这是一个面向JDK的粗略脚本,您需要根据您的特定需求进行调整,使其输出和退出状态与脚本所需的匹配。

在我的(PC)工作站上,它返回:

 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 

我不知道您正在寻找什么信息,但您可以使用获取一些版本信息

 System.getProperty("java.version"); 

如果这不是您要查找的内容,请在此处查看其他可用属性: http : //docs.oracle.com/javase/6/docs/api/java/lang/System.html#getProperties ()

至于最新的可用版本,我想你必须手动解析这个站点: http : //java.com/en/download/index.jsp

最新版本就在那里,目前正是如此

版本7更新9

你写道,这不是你想要的,因为“Oracle可以改变他们的网站和风格”。 但是,您希望通过访问其服务(本例中为网站)来查找最新版本的Java。 只要您不为此付费,他们就没有义务,并且可以在未经您同意的情况下随时更改服务。 即使您是付费客户,您最希望的是他们会告知您即将发生的变化,您的维护问题仍然存在。

请记住,这是您想要使用的服务。

我已经用这个时髦的脚本解决了一个类似的问题(免责声明:某种程度上是一个“玩具”脚本):

 @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"]}" 

它产生如下:

 Last available java version: Version 7 Update 9 Currently installed java version: 1.7.0_07 

如果您想避免由于更改页面结构而导致的维护问题,可能更好的选择是搜索包含“Version x Update y”的行。

获取所有系统变量

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

示例输出,根据您的操作系统和Java JDK / JRE版本,您的系统可能会有所不同。

 { 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 } 

仅检索特定变量

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

产量

 1.8.0_31 

@MarcelStör的解决方案不再有效 – 文件中的版本是1.8.0_51,而实际的最新版本是1.8.0_91 / 92。 如果您转到Firefox或Chrome中的Java测试页面并打开开发控制台,您可以获得当前为1.8.0_91的变量1.8.0_91 。 这可以包含在Selenium / Firefox解决方案中,但却是获取此信息的一种令人难以置信的hacky方式。

 System.getProperty("java.vm.specification.version"); System.getProperty("java.version");