私は、私用システム (jdk 7) と大学の数値計算サーバー (jre 1.4) の両方で使用するために、Java で私用コマンド ライン ツールを作成するつもりです。ソースから OpenJdk をインストールしようとして失敗しました。いくつかの依存関係が欠落しており、計算サーバー (CUPS など) では単に意味をなさないためです。そのような依存関係とその依存関係をインストールするために必要な作業は、タスクを自動化する、つまり生活を楽にするという点全体を台無しにしてしまうでしょう。
ジェネリックの便利さに慣れているので、1.4 SOURCE コードを書きたくありません。コマンドラインからコンパイルすると、次のようなオプションが見つかりました
javac -target 1.4 -bootclasspath jdk1.4.2/lib/classes.zip \
-extdirs "" OldCode.java
([1] を参照) が利用可能であり、新しいライブラリ機能 (-bootclasspath が対象) を明確にしている限り、jdk5 または jdk7 固有の構文を jdk1.4 互換バイトコードにコンパイルできるはずです。
これにより、次の 2 つの問題が発生します。
Netbeans 7.3 では、各プロジェクトの準拠レベルを特定の Java バージョンに簡単に設定できますが、1.4 構文も使用する必要があります (おそらく
-source 1.4
上記のコマンドに追加することによって)。古いjdk(具体的にはclasses.zip)は、oracle.comを除いてどこにも見つかりませんでした.oracle.comでは、登録マスクだけでそれらをダウンロードするには登録が必要であり、それらが私的使用を意図していないことを明確にしています.
これまでに見つけたすべての関連する回答は、netbeans でこの種のバイトコード/ソース区切りのクロスコンパイルを行う方法のヒントを与えず、古い JDK を見つける問題に対処するものもありません。
Eclipse は実際にはオプションではありません。netbeans のように JAR を自動生成する方法がわからなかったからです。
何か案は?
プラットフォームの詳細:
ローカル (Netbeans の「ヘルプ → 概要」から):
Product Version: NetBeans IDE 7.3 (Build 201302132200) Java: 1.7.0_11; Java HotSpot(TM) 64-Bit Server VM 23.6-b04 Runtime: Java(TM) SE Runtime Environment 1.7.0_11-b21 System: Windows 7 version 6.1 running on amd64; Cp1252; de_DE (nb)
リモート:
java version "1.4.2_11" Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_11-b06) Java HotSpot(TM) 64-Bit Server VM (build 1.4.2_11-b06, mixed mode)
更新:念のために言っておきますが、新しい構文を使用してソースを Java 1.4 にコンパイルすることは可能です。たとえば、私はこのファイルを書きました:
class Target<T>{
public T field;
public static void main(String[] args){
System.out.println("Hello World!");
Target<String> target = new Target<>();
target.field = "More Worlds.";
System.out.println(target.field);
}
}
次に、JDK 7でコンパイルしました
javac -target jsr14 Target.java
JRE 1.4のみが存在する(JDKはまったく存在しない)計算サーバーにアップロードしました。期待される出力が得られました
Hello World!
More Worlds.
どうやら "jsr" ターゲットは文書化されていない機能のようです。たとえば [2] を参照してください。また、そのリンクは、コレクション ライブラリの for-each ループのみが処理されるため、ちょっとしたハックであると述べています。
for-each ループ: 配列を反復処理する場合、コンパイラは帰納変数と標準の配列反復イディオムを生成します。Collection を反復処理する場合、コンパイラは標準の反復子ベースのイディオムを生成します。Collection 以外の Iterable を反復処理すると、コンパイラはエラーを生成します。
つまり、合理的に最新の機能を使用したい場合は、サーバーに新しい JRE を取得するしかないということです...
[1]古いバージョンの Java をサポートする .java をコンパイルするにはどうすればよいですか?
[2] http://twit88.com/blog/2008/08/26/java-understanding-jsr14/