validationjava版本兼容性

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

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

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

有一个“启动”类,它对任何新的JDK类或任何应用程序的类都没有依赖关系(= imports)。 你不要通过名字导入你的主类!

就像是:

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

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

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 (并且编译该类) -source 1.2 -target 1.2使用常规编译器编译其余类(例如,创建Java7 .class文件)。

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

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

 < - 编译Java 1.2的入门类 - >
   

 < - 用Java 1.6编译其余部分 - >
 
   
   <类路径>
       ....
   
 

然后将所有内容放入一个jar文件中。

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

也看到这个问题 。

您可以编译指定旧版本的jar。 有关详细信息,请查看此链接。

考虑使用Java Web Start技术部署软件。 然后,您可以在jnlp文件中指定应用程序支持的确切Java版本。

具体来说,最小的java版本是在j2se元素中声明的。

例如:

    Dynamic Tree Demo Dynamic Team             

有关更多信息,请参阅此链接