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编译其余部分 - > <类路径> .... 类路径> javac的>
然后将所有内容放入一个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
有关更多信息,请参阅此链接
- 当我尝试初始化GoogleMap对象时,我得到一个NullPointerException
- Android:MediaPlayer AUDIOFOCUS_LOSS和setOnErrorListener()问题
- 如何实现高效的Alpha-Beta修剪游戏搜索树?
- 无法分配最终的局部变量,因为它是在封闭类型中定义的?
- 使用android.intent.action.VIEW打开另一个应用程序
- 如何使用chrome驱动程序使用Java覆盖selenium2中的基本身份validation?
- 如何使“层次结构查看器”在真实设备中工作?
- “获取时超时”URLFetch GAE / J.
- intentservice没有空构造函数,但是有一个构造函数