我有一个使用 jdk 1.7 编译的 jar 文件,我想在加载期间检查我的 jar 在其下运行的 java 运行时环境是 1.7 或更高版本。有没有办法做到这一点?
我尝试使用 System.getProperty("java.version") 但这没有帮助,因为我的类版本是 51 并且 jre 1.6 拒绝加载它。
我有一个使用 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 版本)中不可用的类的任何导入。
然后编译MyStarter
(并且只编译那个类) 用-source 1.2 -target 1.2
常规编译器编译你的其余类(例如创建 Java7 .class 文件)。
如果您生成可执行 jar,则添加com.foo.MyStarter
为Main-Class:
属性。
我的 Ant 中的“编译”目标build.xml
看起来像这样:
<-- 编译 Java 1.2 的 starter 类 --> <javac destdir="${build}" srcdir="${src}" 目标=“1.2” 来源="1.2" 编码="ISO-8859-1" 包括antruntime="假" 包括="com/foo/MyStarter.java"/> <-- 为 Java 1.6 编译其余部分 --> <javac destdir="${build}" srcdir="${src}" 目标=“1.6” 来源="1.6" 包括antruntime="假" 编码="ISO-8859-1"> <exclude name="com/foo/MyStarter.java"/> <类路径> …… </类路径> </javac>
然后将所有内容放入一个jar文件中。
可悲的是,如果它是在 1.7 上编译的,它不会在任何旧版本上运行......所以你添加的任何代码都不会真正运行(悲伤的脸)。-target 1.6
您可以使用该标志针对旧版本编译它。但是从您的帖子看来,您需要 1.7 的功能。因此,也许您可以编写一个针对旧版本 Java 编译的“包装器”应用程序,进行检查,然后加载并运行您的 jar - 或者您可以使用某种脚本实现相同的目的。
另请参阅此问题。
考虑使用 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>
您可以编译指定旧版本的 jar。检查此链接以获取更多详细信息。