如何获取当前可用的Java版本?

4

如何使用C#获取当前可用的Java版本?

我已经能够找到一种方式来使用C#获取我的电脑上的Java版本,但我需要能够将安装的版本与最新可用版本进行比较。目前我无法找到一个API或Web服务来获取这些信息。

希望这里有人知道答案。


使用C#运行Unix命令。回显您拥有的Java版本。我不知道如何在没有硬编码的情况下知道Java的最新版本。 - But I'm Not A Wrapper Class
4
你的问题非常不清楚。你是在问如何从某人那里找到最新的Java版本(有很多不同的版本),还是寻找安装在某台机器上的最新版本? - chrylis -cautiouslyoptimistic-
我正在寻找编写某些代码的方法,以访问一些 API、Web 服务,以查找代码的最新版本。然后将其与用户安装的版本进行比较。有了这些信息,我将执行其他操作。 - William Norris
3个回答

7

最新版本可用

您可以从此页面下载当前可用的版本:

http://java.com/en/download/index.jsp

使用此选择器。
.jvc0w2 > strong:nth-child(3)

C#的HTML Agility Pack这样的库可以使这变得简单明了。

当前安装的版本

RegistryKey rk = Registry.LocalMachine;
RegistryKey subKey = rk.OpenSubKey("SOFTWARE\\JavaSoft\\Java Runtime Environment");

string currentVerion = subKey.GetValue("CurrentVersion").ToString();

注意事项

您需要协调这两个字符串的格式以进行比较。

如果我引用的检查当前版本的网站发生更改,您可能需要更新您的选择器。


3
除非Oracle更改那个页面的结构/CSS。 - Mike G
@mikeTheLiar 没错,在底部我指出了这一点。重要的限制条件。感谢您提到这一点,因为很容易忘记这个依赖关系。 - Chris Ballance
首先我不能使用第三方包。其次,如果我在下一个版本发布时搜索版本号,如果它不是相同的格式,那么我就必须重新编码,MikeTheLiar是正确的。但在回答中,你似乎更接近问题的答案。所以我的理解是,没有Web服务或API允许用户获取最新的Java版本。考虑到安装的Java会让用户知道有新的版本可用,一定有办法解决这个问题。也许这些信息不向公众开放,需要我自己去解决。 - William Norris
你完全不必使用第三方包,但如果你没有从头开始解析HTML的经验,使用第三方包会使解析HTML变得更加容易。第二个问题是合理的,页面可能会发生变化,但我不知道有什么更直接的方法可以咨询Java大神最新版本是什么。 - Chris Ballance
1
当我访问链接并点击“获取Java版本”(或其他)时,它告诉我我没有所需的插件。在查看regedit时,我没有在HKEY_LOCAL_MACHINE\SOFTWARE中找到JavaSoft文件夹。 - B. Clay Shannon-B. Crow Raven

3

尝试:

ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = "javac";
psi.UseShellExecute = true;
psi.RedirectStandardError = true;

psi.Arguments = "-version";
Process p = Process.Start(psi);
string strOutput = p.StandardError.ReadToEnd();
p.WaitForExit();

然后你需要解析输出的字符串。这个输出通常长成这个样子:
javac 1.6.0_27

如果您对运行时环境(RE)感兴趣,请用java代替javac


这在我这里失败了,我已经安装了Java 1.7.0_25。(命令行找不到javac或java) - Chris Ballance
1
当然这并不意味着Java没有被安装。但是由于没有人知道Java编译器的位置(除非进行硬盘搜索),因此应该利用Java通常会将自己添加到$PATH环境的事实。 - Willem Van Onsem
1
在启动进程的代码行周围添加try/catch块可以是一种懒惰地检查javac存在性的方法。 - Chris Ballance
1
我收到了一个System.InvalidOperationException未处理的异常 HResult=-2146233079 Message=必须将Process对象的UseShellExecute属性设置为false才能重定向IO流。 当我这样做(将UseShellExecute设置为false)时,我会得到“系统找不到指定的文件” - B. Clay Shannon-B. Crow Raven
1
@B.ClayShannon:确实,这是关于 shell 的错误。但是关于文件,这取决于您将 javac 与实际编译器绑定的级别。最好不要在编译器级别上这样做。 - Willem Van Onsem
显示剩余4条评论

1

查找所有java.exe文件并以“java -version”运行它们。 输出看起来像这样:

java version "1.6.0_35"
Java(TM) SE Runtime Environment (build 1.6.0_35-b10)
Java HotSpot(TM) Client VM (build 20.10-b01, mixed mode, sharing)

这样你就能知道版本号了。

你还应该查找已安装的Java版本使用的文件夹结构。


由于这是一个关于C#或Java的问题,William正在寻找代码而不是运行命令。 - Micah Armantrout
@MicahArmantrout,我不是这样理解问题的。它并没有说他正在寻找代码。我理解为他可以找到已安装的版本,但需要知道如何在计算机上找到其他版本。寻找文件、运行程序和收集输出对我来说似乎是细节。 - Lee Meador
目前我找不到任何API或Web服务来获取这些信息。 - Micah Armantrout
@MicahArmantrout,我解释了一种不使用任何一种的方法。先生,我们可能对此持不同意见。 - Lee Meador
@MicahArmantrout,由于你正在跨越虚拟机平台,因此没有好的方法从.NET中提出Java问题。 exec是最实用的选项。 - chrylis -cautiouslyoptimistic-
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接