Java проверяет последнюю версию программно
Цель: проверить версию java на компьютере (я могу получить это от java -version
). Сравните это с последним из веб-сайт java
Я хотел бы знать, есть ли способ проверить последние версии Java, предполагая, что JRE/JDK установлен на компьютере.
Если я смогу сделать это через Java, мое решение станет независимым от платформы. Я мог бы использовать класс java.net.URL
для отправки запроса на веб-сайт Java и получения HTML-кода, однако ответ будет динамичным, так как Oracle может изменить свой веб-сайт и стили и, возможно, будет иметь проблемы с обслуживанием в долгосрочной перспективе.
Я просмотрел javatester.org, но я бы не хотел его с помощью апплета, но через командную строку (которую я могу добавить в script).
Через javacpl.exe я могу запланировать периодические проверки, но я хотел бы сделать это по запросу.
Ответы
Ответ 1
Ответ на самом деле довольно прост. 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
Eventough Недавно была выпущена 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
.
Ответ 2
UPDATE: я не рекомендую этот метод, потому что это JRE - это та, которая имеет панель инструментов Ask.com. Вам лучше загружать его самостоятельно и распространять его самостоятельно.
Программа jusched.exe обращается к следующему URL, чтобы узнать, какие версии доступны. Я думаю, что он с меньшей вероятностью изменится, потому что jusched установлен на миллионы компьютеров.
https://javadl-esd-secure.oracle.com/update/1.7.0/map-m-1.7.0.xml
Вот фрагмент того, что он возвращает для меня:
<?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>
Чтобы получить фактическую версию, на которую он указывает, вы должны получить вышеуказанный URL. Вот еще один фрагмент того, как выглядит этот XML:
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>
Тег версии содержит полный номер версии.
Ответ 3
URL-адрес, очень похожий на теперь несуществующий "JreCurrentVersion2.txt":
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.
Ответ 4
Вы можете проанализировать страницу Java SE Downloads, чтобы извлечь версии Java.
Таким образом, вы получаете версию JDK6 и JDK7, которая позволяет протестировать ваш конкретный JDK (6 или 7) против последнего Oracle.
(В отличие от бесплатной страницы загрузки Java, в которой перечислены только JDK7)
Она является грубой script в Перейти, которую вы можете скомпилировать в Windows, Unix, MacOs в один независимый исполняемый файл и использовать в командной строке или 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)
}
}
Опять же, это грубая script, ориентированная на JDK, и вам нужно будет адаптировать ее к вашей конкретной потребности, чтобы ее статус выхода и выхода соответствовал тому, что вам нужно для вашего script.
На моей (ПК) рабочей станции он возвращает:
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
Ответ 5
Я не знаю, какую информацию вы ищете, но вы можете получить информацию о версии с помощью
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, обратившись к их службе (в этом случае сайт). Пока вы не платите за это, они не обязаны вам и могут менять услугу, когда захотят, без вашего согласия. И даже когда вы являетесь платежным клиентом, лучше всего можете надеяться, что они сообщают вам о предстоящих изменениях, и ваши проблемы обслуживания останутся.
Помните, что это ИХ сервис, который вы хотите использовать.
Ответ 6
Я решил аналогичную проблему некоторое время назад с этим groovy script (отказ от ответственности: это как-то "игрушка" 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"]}"
Это дает что-то вроде:
Last available java version:
Version 7 Update 9
Currently installed java version: 1.7.0_07
Если вы хотите избежать проблем с обслуживанием из-за изменений в структуре страницы, возможно, лучшим вариантом является поиск строки, содержащей "Версия x Обновление y".
Ответ 7
Чтобы получить все системные переменные
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
Ответ 8
@Решение MarcelStör больше не работает - версия в файле is 1.8.0_51, а фактическая последняя версия - 1.8.0_91/92. Если вы перейдете на тестовую страницу Java в Firefox или Chrome и откройте консоль разработки, вы можете получить переменную latest8Version
, которая в настоящее время 1.8.0_91
. Это может быть завернуто в решение Selenium/Firefox, но это невероятно хакерский способ получить эту информацию.
Ответ 9
System.getProperty("java.vm.specification.version");
System.getProperty("java.version");