2013-06-27 15 views
6

jdk 1.7を使用してjarファイルをコンパイルしましたが、ロード時にJarファイルを実行しているJavaランタイム環境が1.7以上であることを確認したいと思います。それを行う方法はありますか?Javaバージョンの互換性を確認してください

私はSystem.getProperty( "java.version")を使ってみましたが、私のクラスのバージョンが51で、jre 1.6がそれをロードすることを拒否して以来、助けになりませんでした。

+6

あなたはすでにあなたはわずか1.7以上でこれを実行することができます観察されたように。 1.6でコンパイルされたjarを1.7で実行できますが、それ以外の方法では実行できません。したがって、あなたの小切手は余分です。 – 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バージョン)を確認して、このような何か。その後

(例えばJava7 .classファイルを作成する)通常のコンパイラを使用して、クラスの残りの部分をコンパイルし-source 1.2 -target 1.2MyStarter(およびクラスのみ)をコンパイルします。

実行可能なjarを生成する場合は、をMain-Class:属性として追加します。

 
<-- 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ファイルにすべてをかける:私のAntで

私の「コンパイル」ターゲットbuild.xmlは次のようになります。

+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

関連する問題