验证java版本兼容性

时间:2013-06-27 15:45:45

标签: java

我有一个使用jdk 1.7编译的jar文件,我想在加载时检查我的jar运行的java运行时环境是1.7还是更新。有没有办法做到这一点?

我尝试使用System.getProperty(“java.version”),但这没有用,因为我的班级版本是51而且jre 1.6拒绝加载它。

4 个答案:

答案 0 :(得分:7)

我有同样的要求,我通过以下方式解决了这个问题:

拥有一个“启动”类,它对任何新的JDK类或任何应用程序的类都没有依赖关系(= imports)。你的男人按名称导入你的主要课程!

类似的东西:

在该入门类中,检查所需的Java版本。

如果检查成功,则使用反射加载主类并启动它的主方法(或您使用的任何方法)。像这样:

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版本)。

然后使用MyStarter编译-source 1.2 -target 1.2(以及该类) 使用常规编译器编译其余类(例如,创建Java7 .class文件)。

如果生成可执行jar,则添加com.foo.MyStarter作为Main-Class:属性。

我的Ant build.xml中的“编译”目标看起来像这样:

<-- 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文件中。

答案 1 :(得分:6)

可悲的是,如果它是在1.7上编译的,它将无法运行在更旧的任何东西上......所以你添加的代码实际上不会运行(悲伤的面孔)。您可以使用-target 1.6标志针对旧版本对其进行编译。但从您的帖子看,您需要1.7的功能。所以也许你可以写一个“包装”应用程序,它是针对旧版本的Java编译的,做了你的检查,然后加载并运行你的jar - 或许你可以用某种脚本实现同样的东西。

另见this question

答案 2 :(得分:0)

您可以编译指定旧版本的jar。 Check this link for further detail.

答案 3 :(得分: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>

See this link for more information