質問

マシンにインストールされているJREのバージョンが、ユーザーが実行したいアプリケーションに対して十分に高いかどうかを判断する最良の方法は何ですか? java専用のものを使用してそれを行う方法はありますか?このソリューションがWindows / Linux / MacOSXで動作するようにしたい-JREバージョンが低すぎる場合、メッセージが表示されるはずです。現在、Java 1.5で実行しようとすると例外が発生します(アプリはJava 1.6用に構築されています)。普遍的な解決策がない場合、Windowsでそれを行う最良の方法は何ですか?

役に立ちましたか?

解決

上位バージョンのJRE用に構築されたアプリケーションは、下位バージョンのJREでは実行されません。そのため、アプリケーションにコードを追加してJREバージョンをチェックすることはできません。JREバージョンに互換性がない場合、JREバージョンチェックコードは最初から実行されません。

やらなければならないことは、バージョンを確認し、必要に応じてアプリを起動する下位バージョンのJRE(1.3?)向けにビルドされたランチャーアプリケーションです。これはちょっと気味悪いように思えます。

インストール中にバージョンをチェックするのはどうですか?環境変数を確認できるようにアプリをインストールしていますか、それとも何らかのスクリプトを実行していますか?

他のヒント

リフレクションと2つのコンパイラを使用してこれを行うことができます。実行したい最も古いJavaバージョンでメインクラスをコンパイルします。 System.getProperty(" java.version")などを使用してバージョンをチェックし、そのチェックに合格した場合、リフレクションを使用して real メインクラスをロードします。 jarを直接ロードすることもできます。 JREは、コンパイル時に外部メインクラスによって参照されなかったクラスをロードしないでください。

Java Webstart を検討できます。名前がアプレットのようなものを意味する場合でも、それはスタンドアロンアプリケーションに関するものです。 Webstartはランチャーであり、JNLPファイル(アプリのダウンロード場所、必要なJavaバージョン、その他のメタデータを設定する単純なXMLファイル)をチェックし、正しいJREでアプリを起動します。新しいバージョンが利用可能な場合は、アプリケーションも更新します。欠点は、JNLPファイルを作成する必要があることです。次に例を示します。

<?xml version="1.0" encoding="utf-8"?>

<!--
###############################################################################
#
# @(#)draw.jnlp 1.6 02/09/11
#
# JNLP File for Draw Demo Application
#
###############################################################################
 -->


<jnlp spec="0.2 1.0"
      codebase="http://java.sun.com/javase/technologies/desktop/javawebstart/apps"
      href="draw.jnlp">
   <information> 
      <title>Draw 4 App</title> 
      <vendor>Sun Microsystems, Inc.</vendor>
      <homepage href="http://java.sun.com/javase/technologies/desktop/javawebstart/demos.html"/>
      <description>A minimalist drawing application along the lines of Illustrator</description>
      <description kind="short">Draw Demo Short Description</description>
      <icon href="images/draw.jpg"/>
      <offline-allowed/> 
   </information> 
   <resources>
      <j2se version="1.3+" href="http://java.sun.com/products/autodl/j2se"/>
      <j2se version="1.3+"/>
      <jar href="draw.jar" main="true" download="eager"/>
   </resources>
   <application-desc main-class="Draw"/>
</jnlp> 

2番目の可能性は、ランチャープログラムを使用することです。例は、 Apache Commons Launcher です。自分でランチャーアプリを作成することもできますが、通常は努力する価値はありません。

Commons-Launcherの使用を検討することもできます。これにより、さまざまな環境設定をセットアップしたり、アプリケーションを呼び出す前に事前チェックを実行したりできます。

http://commons.apache.org/launcher

一般に、Cまたは(UNIXのみの場合)シェルラッパーを使用してこれにアプローチしました。これが本当にあなたのために働くかどうかわからない。

また、製品にJREを埋め込むことでこれにアプローチします。ケースの99.9%を処理します(他の0.1%の時間は、別のJVMを使用するように構成を明示的に変更するユーザーです)。繰り返しますが、これがあなたにとって合理的な解決策であるかどうかはわかりません。

このケースでは、かなりの量のネイティブコード(JNIなど)があるため、サポートする各プラットフォーム用にインストール可能なイメージを調整する必要があります。ただし、pure-Javaソリューションを扱っている場合は、最低限のことを文書化し、プログラムを実行するように人々に伝える必要があります(しゃれはありません)。私のMacでMSVCが実行されない、またはLinuxボックスでWorld of Warcraftの実行に問題があると不満を言う人のようなものです。ソフトウェアが対象とする(仮想)マシンではありません-切り替える必要があります。少なくともJavaの世界では、誰かのOS宗教的な感情を傷つけることなく、これを本当にアップグレードと呼ぶことができます。 (MacユーザーにWindows XPに「アップグレード」してMSVCを実行するように言ってみてください-すぐに解決します)

Javaコマンドを実行するときにJavaバージョンを要求できます。 java -version:1.6 * com.me.MyClass 。これがJavaのすべてのリリースで動作するかどうかはわかりませんが、1.6では問題なく動作します。

ランチャーの場合-バージョンを確認します。

APPの内部。上記のようにSystem.getProperties();

を使用します
Properties sProp = java.lang.System.getProperties();
String sVersion = sProp.getProperty("java.version");
sVersion = sVersion.substring(0, 3);
Float f = Float.valueOf(sVersion);
if (f.floatValue() < (float) 1.4) {
    System.out.println("Java version too low ....");
    System.exit(1);
}
...

1.6クラスの real main()を呼び出すJava 1.2用にコンパイルされた起動クラスを用意します。サポートされていないクラスの例外がスローされると、それらをキャッチして、素敵なエラーメッセージを表示します。

システムにインストールされているJREバージョンを取得するコードは次のとおりです。

var list = deployJava.getJREs();
var result = "";
result = list[0];
for (var i=1; i<list.length; i++)
{
    result += ", " + list[i];
} 
document.write("jre version : "+result);

System.getProperties()は、JRE、JVM、および仕様のさまざまなバージョンIDを含むJVMプロパティのリストを提供します。これはJavaのすべてのバージョンに実装されているため、コンパイルされたバージョン、実行されたバージョン、または実装に関係なく動作します。

バージョンをテストするための基本クラスを作成する場合は、main()起動クラスで最初にこれを呼び出すことができます。ただし、実際には基本的な機能である必要があります。そうしないと、破損する恐れがあります。

うーん、退屈な人と呼んでください。しかし、たとえばLaunch4Jや他のネイティブランチャーの使用の何が問題なのでしょうか。

実際にコードを実行する前に、ネイティブランチャーを使用してJVMバージョンを確認します。 Javaのみのソリューション(私の本では)は、開発者とやり取りする場合にのみ意味があります。エンドユーザーを襲ったら、彼らはJavaやその技術的な詳細をまったく気にしていないことに気付くでしょう。 GW-Basicでアプリケーションを記述した場合、アプリケーションが機能する限り、彼らはそれほど気にしません。

Java 1.6がインストールされていない場合、lauchner4jはJDK 1.6のダウンロードページをユーザーに示します。これはおそらく、Javaで魔法をかけるよりもあなたの問題に適しているでしょう。

WinRun4J は非常にうまく機能することがわかりました(しかし、もう一度私がそれを書いたので、偏っている:-))。これにより、許可されるJavaの最小バージョンおよび/または最大バージョンを指定できます。適切なJREバージョンが見つからない場合(およびメッセージはカスタマイズ可能)、ユーザーにメッセージボックスがポップアップ表示されます。

上記のすべては非常に複雑です。 ただ行く:

Properties props = System.getProperties()
props.list(System.out)

JVM、JRE、JDK、およびスタッフに関するすべてが表示されます。 または、次を使用して特定の値を取得します。

//full list of possible props you can see if u run code above
String props = System.getProperty(prop)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top