验证java版本兼容性

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

我尝试使用System.getProperty(“java.version”),但这没有帮助,因为我的类版本是51和jre 1.6拒绝加载它.

解决方法

我有同样的要求,我通过以下方式解决了它:

有一个“启动”类,它对任何新的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版本).

然后用-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文件中.

相关文章

ArrayList简介:ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增...
一、进程与线程 进程:是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。 线程...
本文为博客园作者所写:&#160;一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/ 简单的一个类...
#############java面向对象详解#############1、面向对象基本概念2、类与对象3、类和对象的定义格式4、...
一、什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错。在java中,阻止当前方法或作用域...
Collection接口 Collection接口 Collection接口 Collection是最基本的集合接口,一个Collection代表一组...