12

确定机器上安装的 JRE 版本是否足以满足用户想要运行的应用程序的最佳方法是什么?有没有办法使用仅限 java 的东西来做到这一点?我希望该解决方案适用于 Windows/Linux/MacOSX - 如果 JRE 版本太低,则应显示一条消息。目前,如果我尝试在 Java 1.5 上运行它(该应用程序是为 Java 1.6 构建的),我会遇到异常。如果没有通用解决方案,那么在 Windows 上最好的方法是什么?

4

13 回答 13

11

您可以使用反射和两个编译器来做到这一点。使用您希望能够运行的最旧的 java 版本编译一个主类。它使用 , 或其他方式检查版本System.getProperty("java.version"),然后如果检查通过,则使用反射加载您的真实主类,甚至可能直接加载 jar。JRE 不应在编译时加载外部主类未引用的任何类。

于 2008-10-21T18:11:25.560 回答
9

您可能会考虑Java Webstart。即使这个名字暗示着类似小程序的东西,它也是关于独立应用程序的。Webstart 是一个启动器,它检查 JNLP 文件(一个简单的 XML 文件,您可以在其中配置应用程序的下载位置、所需的 Java 版本和一些其他元数据)并使用正确的 JRE 启动您的应用程序。如果有更新的版本可用,它甚至会更新应用程序。缺点是,您必须编写一个 JNLP 文件。这是一个例子:

<?xml version="1.0" encoding="utf-8"?>

<!--
###############################################################################
#
# @(#)draw.jnlp 1.6 02/09/11
#
# JNLP File for Draw Demo Application
#
###############################################################################
 -->


<jnlp spec="0.2 1.0"
      codebase="http://java.sun.com/javase/technologies/desktop/javawebstart/apps"
      href="draw.jnlp">
   <information> 
      <title>Draw 4 App</title> 
      <vendor>Sun Microsystems, Inc.</vendor>
      <homepage href="http://java.sun.com/javase/technologies/desktop/javawebstart/demos.html"/>
      <description>A minimalist drawing application along the lines of Illustrator</description>
      <description kind="short">Draw Demo Short Description</description>
      <icon href="images/draw.jpg"/>
      <offline-allowed/> 
   </information> 
   <resources>
      <j2se version="1.3+" href="http://java.sun.com/products/autodl/j2se"/>
      <j2se version="1.3+"/>
      <jar href="draw.jar" main="true" download="eager"/>
   </resources>
   <application-desc main-class="Draw"/>
</jnlp> 

第二种可能性是使用启动程序。一个例子是Apache Commons Launcher。您也可以自己编写一些启动器应用程序,但这通常不值得。

于 2008-10-22T13:57:01.597 回答
5

您也可以考虑使用 Commons-Launcher,它允许您设置各种环境设置,或在调用应用程序之前执行预检查。

http://commons.apache.org/launcher

于 2008-10-21T15:32:59.797 回答
2

通常,我们使用 C 或(仅适用于 unix 时)shell 包装器来解决此问题。不确定这是否真的适合您。

我们还通过在我们的产品中嵌入 JRE 来解决这个问题。处理 99.9% 的情况(另外 0.1% 的时间是用户显式更改我们的配置以使用不同的 JVM)。同样,不确定这对您来说是否是一个合理的解决方案。

在我们的例子中,有大量的本机代码(JNI 和其他),因此无论如何都需要为我们支持的每个平台定制一个可安装的图像。但是,如果您正在处理纯 Java 解决方案,您可能只需要记录您的最低要求并告诉人们使用该程序(没有双关语),如果他们要运行您的东西。这有点像人们抱怨我的 Mac 无法运行 MSVC,或者我的 Linux 机器在运行《魔兽世界》时出现问题。这不是软件所针对的(虚拟)机器——你需要切换。不过,至少在 Java 世界中,我们确实可以称其为升级,而不会伤害任何人的操作系统宗教感情。(尝试告诉 Mac 用户“升级”到 Windows XP 以运行 MSVC - 等待发生的失败。)

于 2008-10-21T15:08:18.940 回答
2

运行 Java 命令时,您可能需要 Java 版本,例如java -version:1.6* com.me.MyClass. 不确定这是否适用于所有 Java 版本,但无论如何它在 1.6 上都可以正常工作。

于 2009-08-10T15:49:13.297 回答
1

为较高版本的 JRE 构建的应用程序不会在较低版本的 JRE 上运行。因此,您不能只向应用程序添加代码来检查 JRE 版本 - 如果 JRE 版本不兼容,您的 JRE 版本检查代码将不会首先运行。

您需要做的是拥有某种为低版本 JRE(1.3?)构建的启动器应用程序,该应用程序检查版本,然后在必要时启动您的应用程序。这对我来说听起来有点笨拙。

在安装过程中检查版本怎么办?您是否以允许您检查环境变量或执行任何类型的脚本的方式安装应用程序?

于 2008-10-21T15:00:21.077 回答
1

对于启动器 - 检查那里的版本。

APP内部;如上使用 System.getProperties();

Properties sProp = java.lang.System.getProperties();
String sVersion = sProp.getProperty("java.version");
sVersion = sVersion.substring(0, 3);
Float f = Float.valueOf(sVersion);
if (f.floatValue() < (float) 1.4) {
    System.out.println("Java version too low ....");
    System.exit(1);
}
...
于 2008-10-21T15:51:57.200 回答
1

有一个为 Java 1.2 编译的启动类,它调用 1.6 类中的真正main()。如果抛出了不受支持的类异常,它们会捕获它并显示一个很好的错误消息。

于 2010-06-21T19:19:42.687 回答
1

这是获取系统中安装的 JRE 版本的代码。

var list = deployJava.getJREs();
var result = "";
result = list[0];
for (var i=1; i<list.length; i++)
{
    result += ", " + list[i];
} 
document.write("jre version : "+result);
于 2011-04-14T11:09:41.323 回答
0

System.getProperties() 为您提供 JVM 属性列表,包括 JRE、JVM 和规范的不同版本 ID。这为所有版本的 Java 实现,因此无论编译的版本和运行的版本如何,或者实现如何,都应该工作。

如果您编写一个基本类来测试版本,您可以首先在您的 main() 启动类中调用它。它必须是真正的基本功能,否则你可能会冒险破坏它。

于 2008-10-21T15:31:29.847 回答
0

嗯 .. 称我为一个无聊的人,但例如,使用 Launch4J 或任何其他本机启动器有什么问题。

在实际运行代码之前,使用本机启动器检查 JVM 版本。仅 Java 的解决方案(在我的书中)只有在与开发人员打交道时才有意义;一旦你接触到最终用户,你就会意识到他们根本不关心 Java 或其技术细节。如果您使用 GW-Basic 编写应用程序,只要您的应用程序正常工作,他们就不会在意。

如果未安装 Java 1.6,lauchner4j 会将用户指向 JDK 1.6 的下载页面。那可能比在 Java 中做魔术更适合您的问题。

于 2008-10-22T00:01:29.160 回答
0

我发现WinRun4J对我来说工作得很好(但是我可能再次有偏见,因为我写了它:-))。这使您可以指定允许的 Java 的最小和/或最大版本。如果没有找到合适的 JRE 版本(并且该消息是可定制的),它将向用户弹出一个消息框。

于 2009-05-08T17:54:28.730 回答
0

以上这些都太他妈复杂了。去吧:

Properties props = System.getProperties()
props.list(System.out)

您将看到有关您的 JVM、JRE、JDK 和员工的所有信息。或使用以下方法获取特定值:

//full list of possible props you can see if u run code above
String props = System.getProperty(prop)
于 2013-03-09T15:29:10.823 回答