验证Java版本兼容性。

6

我有一个使用JDK 1.7编译的JAR文件,我想在加载时检查运行我的JAR文件的Java运行环境是否是1.7或更新版本。有没有方法可以做到这一点?

我尝试使用System.getProperty("java.version"),但由于我的类版本是51,而JRE 1.6拒绝加载它,所以这并没有起到帮助作用。


6
正如你所观察到的,你只能在1.7或更高版本上运行此程序。你可以在1.7上运行为1.6编译的jar包,但反过来则不行。因此,你的检查是多余的。 - Ingo
2
有关1.7和兼容性的更多信息,请访问http://www.oracle.com/technetwork/java/javase/compatibility-417013.html。 - Rafael Oltra
4个回答

7
我有同样的需求,我是通过以下方式解决的:
创建一个“启动”类,它没有任何依赖项(=导入)到任何新的JDK类或您应用程序的任何类。您不可以按名称导入您的主类!
类似这样:
在启动器类内部检查需要的Java版本。
如果检查成功,则使用反射加载您的主类并启动它的main方法(或其他方法)。类似这样:
public class MyStarter
{
   public static void main(String[] args)
   {
      String version = System.getProperty("java.version", null);
      boolean isVersionOK = ... ; 

      if (!isVersionOK)
      {
         System.err.println("Wrong Java version detected");
         // or display some messagebox using JOptionPane
         System.exit(1);
      }

      Class mainClass = Class.forName("com.foo.MyMain");
      Method main = mgr.getDeclaredMethod("main", new Class[] { String[].class });
      main.invoke(null, new Object[] { args });
   }
}

请确保MyStarter不包含任何在Java 1.2中不可用的应用程序或类的导入项(或您将要使用的任何Java版本)。

然后使用-source 1.2 -target 1.2编译MyStarter类(仅此类)。 使用常规编译器编译其余类(例如创建Java7 .class文件)。
如果生成可执行的jar文件,则将com.foo.MyStarter添加为Main-Class:属性。
我的Ant build.xml中的"compile"目标大致如下:
<-- compile the starter class for Java 1.2 --> <javac destdir="${build}" srcdir="${src}" target="1.2" source="1.2" encoding="ISO-8859-1" includeantruntime="false" includes="com/foo/MyStarter.java"/>
<-- compile the rest with for Java 1.6 --> <javac destdir="${build}" srcdir="${src}" target="1.6" source="1.6" includeantruntime="false" encoding="ISO-8859-1"> <exclude name="com/foo/MyStarter.java"/> <classpath> .... </classpath> </javac>
然后将所有内容放入一个jar文件中。

很好 - 这就是我所说的封装应用程序 :) - selig

6
很遗憾,如果它是在1.7上编译的话,它将无法在任何旧版本上运行...所以你添加的任何代码都不会真正运行(难过的脸)。你可以使用-target 1.6标志来对较旧的版本进行编译。但从你的帖子中看来,你需要1.7的功能。因此,也许你可以编写一个“包装器”应用程序,该应用程序针对旧版本的Java进行编译,执行检查,然后加载和运行你的jar文件,或者你可以使用某种脚本来实现同样的效果。
另请参见这个问题

0
考虑使用Java Web Start技术部署您的软件。然后,您可以在jnlp文件中指定应用程序支持的确切Java版本。
具体来说,最低Java版本在j2se元素中声明。
例如:
<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" codebase="" href="">
    <information>
        <title>Dynamic Tree Demo</title>
        <vendor>Dynamic Team</vendor>
        <icon href="sometree-icon.jpg"/>
        <offline-allowed/>
    </information>
    <resources>
        <!-- Application Resources -->
        <j2se version="1.6+" href=
           "http://java.sun.com/products/autodl/j2se"/>
        <jar href="DynamicTreeDemo.jar"
            main="true" />

    </resources>
    <application-desc
         name="Dynamic Tree Demo Application"
         main-class="webstartComponentArch.DynamicTreeApplication"
         width="300"
         height="300">
     </application-desc>
     <update check="background"/>
</jnlp>

点击此链接以获取更多信息


0

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