Java以编程方式检查最新版本
目标:在机器上检查java的版本(我可以从Java以编程方式检查最新版本,java,Java,目标:在机器上检查java的版本(我可以从java-version中获得)。将其与可从中获得的最新版本进行比较 我想知道如果我在机器上安装了JRE/JDK,是否有任何方法可以检查最新的Java版本 如果我能通过Java本身做到这一点,我的解决方案将变得与平台无关。我可以使用java.net.URL类向java网站发送请求并获取HTML,但是响应将是动态的,因为Oracle可以更改他们的网站和样式,从长远来看可能会有维护问题 我已经看过了,但我不希望它通过applet,而是通过命令行(我可以添加到
java-version
中获得)。将其与可从中获得的最新版本进行比较
我想知道如果我在机器上安装了JRE/JDK,是否有任何方法可以检查最新的Java版本
如果我能通过Java本身做到这一点,我的解决方案将变得与平台无关。我可以使用java.net.URL
类向java网站发送请求并获取HTML,但是响应将是动态的,因为Oracle可以更改他们的网站和样式,从长远来看可能会有维护问题
我已经看过了,但我不希望它通过applet,而是通过命令行(我可以添加到脚本中)
通过javacpl.exe,我可以安排定期检查,但我想按需执行。我不知道您到底在寻找什么信息,但您可以使用
System.getProperty("java.version");
如果这不是您要查找的,请检查此处的其他可用属性:
()
至于最新的可用版本,我想您必须手动解析此站点:
最新的版本在那里,目前是
版本7更新9
你写道这不是你想要的,因为“Oracle可以改变他们的网站和风格”。但是,您希望通过访问他们的服务(本例中的网站)来了解Java的最新版本。只要你不为此付费,他们对你没有义务,可以随时更改服务,无需你的同意。即使您是付费客户,您最好希望他们会通知您即将进行的更改,而您的维护问题仍然存在
请记住,您想使用的是他们的服务。不久前,我用这个groovy脚本解决了一个类似的问题(免责声明:这是一个“玩具”脚本): 它产生如下结果:
Last available java version:
Version 7 Update 9
Currently installed java version: 1.7.0_07
如果您希望避免由于页面结构的更改而导致的维护问题,可能更好的选择是搜索包含“Version x Update y”的行。您可以解析以提取Java版本。
这样,您就得到了JDK6和JDK7的版本,这允许您根据最新的Oracle版本测试特定的JDK(6或7)。
(与仅列出JDK7的相反) Her是一个粗糙的脚本,您可以在Windows、Unix、MacOs上将其编译为单个独立的可执行文件,并在命令行或脚本中使用:
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
答案其实很简单。向…发出请求。该文件当前只包含一个版本号:“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
尽管目前仍然返回1.7.0_51
更新2016-07-13
看来我们需要每隔几个月再讨论这个问题。。。当前需要扫描JavaScript变量latest8Version
。因此,您可以运行curl-shttps://java.com/en/download/installed8.jsp |grep最新8版
更新2018-08-19
更新:我不推荐这种方法,因为这个JRE是一个有Ask.com工具栏的JRE。你最好自己下载并分发
System.getProperty("java.vm.specification.version");
System.getProperty("java.version");
jusched.exe程序访问以下URL以了解可用的版本。我认为它不太可能改变,因为jusched安装在数百万台计算机上
下面是它为我返回的一个片段:
<?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>
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=“是”?>
Java更新-更新可用
Java更新可用
Java 7 Update 25已准备好安装。安装Java 7 Update 25可能会从系统中卸载最新的Java 6。单击Install按钮立即更新Java。如果希望以后更新Java,请单击“以后”按钮。
http://java.com/moreinfolink
Java更新可用
Java的新版本即将安装。
更多信息。。。
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
版本标签包含完整的版本号。获取所有系统变量
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
不再工作-是1.8.0_51,而实际的最新版本是1.8.0_91/92。如果您在Firefox或Chrome中打开开发控制台,您可以获得变量
latest8Version
,该变量当前为1.8.0\u 91
。这可以包装在Selenium/Firefox解决方案中,但这是一种获取此信息的令人难以置信的黑客方式。一个与现已失效的“JreCurrentVersion2.txt”非常相似的URL:
链接的内容如下所示:
1.8.0_111
1.7.0_121
1.6.0_131
1.5.0_99
1.4.2_43
您可以轻松地解析内容以查找最新的JRE版本。“但是
1.8.0_31
1.8.0_111
1.7.0_121
1.6.0_131
1.5.0_99
1.4.2_43