9

利用可能な場合、Java 7 SDKのNIO2機能の一部(具体的にはファイルシステムウォッチャー)を使用することに興味がありますが、Java 7用にクラスをコンパイルして、Java6ランタイムを除外したくありません。主な理由は、Mac OS Xとの互換性を維持したいという理由と、ユーザーにアップグレードを強制したくないという理由です。

これは可能ですか?それを行うための最良の方法は何ですか?リンクや例はありますか?

これが私が想像できるいくつかの方法です:別のコンパイラでクラスファイルをコンパイルし、Javaバージョンに基づいて動的にロードしますか?または多分反射を使用していますか?それとも、Java6互換のクラスを生成するためのJava7のコンパイラ設定だけがあるのでしょうか。

私は醜い混乱にならない解決策を探しています:)ですから、理想的には、インターフェイスの2つの実装を記述できます。1つは新機能を使用し、もう1つは使用せず、反射呼び出しを行う代わりに動的に1つを選択します。あらゆる所に。

4

4 に答える 4

9

-target 1.6でビルドし、コードを整理するだけで、1.7を使用するモジュールの周りでClassNotFoundExceptionsとNoClassDefFoundErrorsをきれいにキャッチできます。たとえば、別のクラスローダーを使用してそれらをロードする場合があります。

于 2011-09-29T23:47:38.500 に答える
1

ツールキットが指摘しているように、Java1.6用に簡単にビルドできます。ただし、Java 6に存在しないメソッドに誤ってアクセスしないようにする必要があります。これにより、本番コードでランタイム例外が発生します。

mavenを使用している場合は、maven-enforcer-pluginを使用して、Java1.7クラスまたはメソッド呼び出しが1.6用にビルドされたコードに侵入しないようにすることができます。

例として、Java1.4から1.5への変更があります。私は1.4をターゲットに1.5でビルドしていましたが、誤って次のものを使用しました。

new BigDecimal(5);

これはうまくコンパイルされ、私にとってはうまくいきました。しかし、クライアントはまだ1.4を使用していたため、失敗しました。このコンストラクターは1.4には存在しないためです。1.5で導入されました。

もう1つの解決策は、2つのjarを作成し、1つは新しいnioのものを使用し、もう1つは古いものを使用して、インストール時にユーザーがjava1.7を実行しているかどうかを検出することです。その場合は、適切な実装を含むjarを追加します。

于 2011-09-29T14:44:01.800 に答える
0

ファイルシステムウォッチャーに関しては、Java 7以前は、ファイルのプロパティを数秒ごとにポーリングして、ファイルが変更されていないことを確認していました。必ずしも良いとは言えませんが、実際には目立ったリソースを使用せず、エンドユーザーの観点からは同じように機能しているように見えます。

より包括的なライブラリをお探しの場合は、 http://commons.apache.org/jci/commons-jci-fam/index.htmlをチェックしてください。これは、使用したことはありませんが、同様のことを行うと思います。

ソース1.7とターゲット1.6を指定すると、動作しないと確信しています。しばらく前に別の理由で試してみましたが、メモリからJVMが互換性のないフラグについて文句を言いました(7の新しいinvokedynamicが原因だと思います)。

于 2011-09-29T14:38:22.257 に答える
0

Java 7で追加された一部の要素については、機能を提供するJava 6jsrjarを見つけることができる場合があります。ただし、これがFileSystemWatcherの場合には当てはまらないと思います。

于 2011-09-29T14:32:01.487 に答える