2013-06-27 190 views
6

我有一个jar文件编译使用jdk 1.7,我想在加载时检查我的jar下运行的java运行时环境是1.7或更新。有没有办法做到这一点?验证java版本的兼容性

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

+6

正如你已经看到你只能用1.7或更高版本上运行此。你可以运行一个1.6编译为1.7的jar,但不能以其他方式运行。因此,你的支票是多余的。 – Ingo

+2

有关1.7和兼容性检查的更多信息http://www.oracle.com/technetwork/java/javase/compatibility-417013.html –

回答

6

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

另见this question

7

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

有绝对没有依赖性(=进口)到任何新的JDK类或任何应用程序的类的“启动”类。你的男人不是按名称导入你的主类!

喜欢的东西:

里面起动机类,请检查您需要的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文件。

+0

不错 - 这就是我的意思是一个包装应用程序:) – selig

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