验证java版本的兼容性
我有一个jar文件编译使用jdk 1.7,我想在加载时检查我的jar下运行的java运行时环境是1.7或更新。有没有办法做到这一点?验证java版本的兼容性
我试过使用System.getProperty(“java.version”),但这没有帮助,因为我的类版本是51,并且jre 1.6拒绝加载它。
不幸的是,如果它是在1.7上编译的,它将不会运行在任何更旧的版本上...所以没有添加的代码会实际运行(悲伤的脸)。您可以使用-target 1.6
标志针对较旧版本进行编译。但从你的帖子看来,你需要1.7的功能。因此,也许你可以编写一个针对旧版Java编译的“包装器”应用程序,做了检查,然后加载并运行你的jar - 或者你可以使用某种脚本实现同样的功能。
我有同样的要求,我解决它通过以下方式:
有绝对没有依赖性(=进口)到任何新的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文件。
不错 - 这就是我的意思是一个包装应用程序:) – selig
考虑使用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>
正如你已经看到你只能用1.7或更高版本上运行此。你可以运行一个1.6编译为1.7的jar,但不能以其他方式运行。因此,你的支票是多余的。 – Ingo
有关1.7和兼容性检查的更多信息http://www.oracle.com/technetwork/java/javase/compatibility-417013.html –