1

私は、私用システム (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 つの問題が発生します。

  1. Netbeans 7.3 では、各プロジェクトの準拠レベルを特定の Java バージョンに簡単に設定できますが、1.4 構文も使用する必要があります (おそらく-source 1.4上記のコマンドに追加することによって)。

  2. 古い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/

4

1 に答える 1

1

JDKは上位互換性がありません。つまり、古いJDKバージョンの新機能をコンパイルすることはできません。(またはそのことについてはJRE)。ジェネリックスなどの言語構造は、私が完全に誤解していない限り、Javaのバイトコードまたはインタープリターの一部です。

AFAIKには2つの選択肢しかありません。1)新しいJDKをインストールするか、2)1.4ソースコードを記述します。

于 2013-03-03T16:55:22.707 に答える