マシンにインストールされている JRE のバージョンが、ユーザーが実行したいアプリケーションに対して十分に高いかどうかを判断する最善の方法は何ですか? Javaのみのものを使用してそれを行う方法はありますか? このソリューションが Windows/Linux/MacOSX で動作することを望みます。JRE のバージョンが低すぎる場合、メッセージが表示されます。現在、Java 1.5 で実行しようとすると例外が発生します (アプリは Java 1.6 用にビルドされています)。普遍的な解決策がない場合、Windows でそれを行う最善の方法は何ですか?
13 に答える
これは、リフレクションと 2 つのコンパイラを使用して行うことができます。実行できるようにしたい最も古い Java バージョンでメイン クラスをコンパイルします。などを使用してバージョンをチェックし、そのチェックに合格した場合System.getProperty("java.version")
はリフレクションを使用して実際のメイン クラスをロードし、場合によっては 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の使用を検討することもできます。これにより、さまざまな環境設定をセットアップしたり、アプリケーションを呼び出す前に事前チェックを実行したりできます。
Javaコマンドを実行するときにJavaバージョンを要求できますjava -version:1.6* com.me.MyClass
。これがJavaのすべてのリリースで機能するかどうかはわかりませんが、とにかく1.6では問題なく機能します。
通常、これには C または (UNIX のみの場合) シェル ラッパーを使用してアプローチしました。これが本当にうまくいくかどうかはわかりません。
また、製品に JRE を組み込むことによってもこれに取り組みます。ケースの 99.9% を処理します (残りの 0.1% の時間は、別の JVM を使用するように構成を明示的に変更するユーザーです)。繰り返しますが、これがあなたにとって合理的な解決策であるかどうかはわかりません.
私たちの場合、かなりの量のネイティブ コード (JNI など) があるため、サポートするプラットフォームごとにインストール可能なイメージを調整する必要があります。しかし、純粋な Java ソリューションを扱っている場合は、最小限のことを文書化し、人々があなたのものを実行する場合は、プログラムを使用するように (しゃれは意図していません) 伝えるだけでよい場合があります。私の Mac が MSVC を実行しないとか、私の Linux ボックスで World of Warcraft を実行する際に問題があると人々が不平を言っているようなものです。それは、ソフトウェアが対象としている (仮想) マシンではありません。切り替える必要があります。少なくとも Java の世界では、OS に対する宗教的感情を傷つけることなく、これをアップグレードと呼ぶことができます。(Mac ユーザーに Windows XP に「アップグレード」して MSVC を実行するように伝えてみてください。ビートダウンが発生するのを待っています。)
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);
ランチャーの場合-そこにあるバージョンを確認します。
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 クラスで実際のmain()を呼び出す起動クラスを Java 1.2 用にコンパイルします。サポートされていないクラス例外がスローされた場合、それをキャッチして適切なエラー メッセージを表示します。
上位バージョンの JRE 用に構築されたアプリケーションは、下位バージョンの JRE では実行されません。そのため、アプリケーションにコードを追加して JRE のバージョンを確認することはできません。JRE のバージョンに互換性がない場合、そもそも JRE のバージョンを確認するコードは実行されません。
あなたがしなければならないことは、バージョンをチェックし、必要に応じてアプリを起動する、下位バージョンの JRE (1.3?) 用に構築されたある種のランチャー アプリケーションを用意することです。これは私にはちょっと不器用に聞こえます。
インストール時にバージョンを確認するのはどうですか?環境変数を確認したり、何らかのスクリプトを実行できるようにアプリをインストールしていますか?
System.getProperties() は、JRE、JVM、および仕様のさまざまなバージョン ID を含む JVM プロパティのリストを提供します。これはJavaのすべてのバージョンに実装されているため、コンパイルされたバージョンと実行されたバージョン、または実装に関係なく機能するはずです。
バージョンをテストする基本クラスを作成する場合は、main() 起動クラスで最初にこれを呼び出すことができます。ただし、それは本当に基本的な機能でなければなりません。そうしないと、壊れる危険があります。
私は、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)
うーん.. 私を退屈な男と呼んでください.
コードを実際に実行する前に、ネイティブ ランチャーを使用して JVM のバージョンを確認します。Java のみのソリューション (私の本では) は、開発者とやり取りする場合にのみ意味があります。エンドユーザーに触れてみると、彼らが Java やその技術的な詳細をまったく気にしていないことに気付くでしょう。GW-Basic でアプリケーションを作成した場合、アプリケーションが機能する限り、彼らはそれほど気にしません。
Java 1.6 がインストールされていない場合、lauchner4j はユーザーを JDK 1.6 のダウンロード ページに誘導します。Javaで魔法をかけるよりも、おそらくあなたの問題に適しています。