web-dev-qa-db-ja.com

Java 8で開発されたプログラムは、Java 7で実行できますか?

私は少し混乱しています。

  1. Oracleは、Java 8はJava 7(後方)との互換性が高い。しかし、Java 8プログラムJava 7で正常に実行できます(SE/EE)?

  2. ポイント1が真の場合、Java 8アプリケーションがデプロイされ、Java 7サーバーサポート?Tomcat 8またはWildFly?

49
Mitsu Garcia

一般的に、いいえ。

後方互換性とは、Java 7プログラムをJava 8ランタイムで実行でき、その逆ではないことを意味します。

その理由はいくつかあります。

  • バイトコードはバージョン管理されており、JVMは.classファイルで見つかったバージョンをサポートしているかどうかを確認します。

  • 一部の言語構成体は、以前のバージョンのバイトコードでは表現できません。

  • 新しいJREには新しいクラスとメソッドがあり、古いものとは機能しません。

本当に、本当にしたい場合(ヒント:しません)、次のようなコードを使用して、コンパイラーにソースをJavaの1つのバージョンとして扱い、別のバージョンのバイトコードを出力するように強制できます。

javac -source 1.8 -target 1.7 MyClass.Java

Mavenでも同じ )、JDK7に対してコンパイルしますが、実際には動作するよりも動作しないことがよくあります。 しないことをお勧めします。

[〜#〜] edit [〜#〜]:JDK 8は明らかにこの正確な組み合わせをサポートしていないため、これは機能しません。他のバージョンの組み合わせでも機能します。

新しいJava古いJVMで動作するプログラムを変換するプログラムもあります。Java 8を5-7に変換するには、 https ://github.com/orfjackal/retrolambda 5未満にするには、次のいずれかを選択できます。 http://en.wikipedia.org/wiki/Java_backporting_tools

これらのハックは、新しいJava 8つのクラスとメソッド、コレクション、ストリーム、時間API、無署名APIなどの関数型プログラミングサポートを含む)を提供しません。それ。

または、Java 8 JEEアプリケーションをアプリケーションサーバーで実行したいので、サーバー全体をJava 8で実行するだけで動作します。

74
Karol S

後方互換性の意味

Vice-Versaではなく、上位構成で下位構成を実行できます。

13
Deepak Tiwari

まあ、 -target コンパイラオプションがあります。これにより、以前のJavaバージョンのクラスファイル形式をターゲットにできます。ただし、これは修正も検出もしません。ターゲットバージョンの後にJDK APIで導入されたクラスまたはメソッドを使用する場合。

6
Nate

下位互換性がないということは、Java7プログラムがJava8で実行されることを意味しますが、その逆は常にではないtrue

Oracle Limit Backward Compatibility も確認できます

3
Rahul Tripathi

一般に、新しいバージョンは後方互換性を提供する必要があるため、人々は作業を捨てる必要がなく、簡単にアップグレードできます。逆の方法(古いバージョンで実行されている新しいバージョン)は必ずしも真ではありません。新しい実装された機能を使用すると、その機能は明らかに前のバージョンには存在せず、機能しないためです。

よろしく

2
ctutte