6

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

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

4

4 回答 4

7

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

有一个“启动”类,它对任何新的 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.MyStarterMain-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文件中。

于 2013-06-27T18:02:44.267 回答
6

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

另请参阅此问题

于 2013-06-27T15:49:35.557 回答
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>

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

于 2013-07-09T07:38:07.613 回答
0

您可以编译指定旧版本的 jar。检查此链接以获取更多详细信息。

于 2013-06-27T16:19:24.550 回答