5

特定のプロジェクトでは、(現時点では) Java アプリケーションの実行に JRE6 のみを使用することが許可されています。したがって、maven-compiler-pluginソースとターゲットの両方に 1.6 を構成しました。

Maven の依存関係に、それ自体が 1.7 をターゲットとし、try-with-resources などの 1.7 の機能も使用する依存関係を含めました。これにより、自分のプロジェクトでコンパイル時のエラーまたは警告が発生すると想定しました (Eclipse を使用しています)。 . しかし、そうではないので、私の質問は次のとおりです。特定のターゲット JRE (私の場合は JRE6) でアプリケーション (またはテスト) を実行する前に、そのような問題を検出することは可能ですか?

4

2 に答える 2

1

部分的な答えにすぎませんが、Mihai が言及したさまざまなライブラリ署名の問題の解決策を見つけました。Animal Sniffer Maven Pluginがあります。これを使用すると、あるフェーズ (テストなど) でチェックする特定の Java ランタイムを指定できます。

ただし、この質問へのコメントで説明されているように、Maven は単に javac からの警告を飲み込む (-nowarn) ため、これはクラス ファイルのバージョンの問題を解決しません。

于 2013-01-21T09:30:02.400 に答える
0

(これをインタラクティブな回答にします。まだ回答がありません。)

ちょっとトリッキー。依存関係のバージョンを調べることができる Ning プラグインは知っていますが、クラス ファイルのバージョンを確認するオプションはありませんでした。リンクされたクラスのバージョンが新しすぎると、 javac が文句を言うことはわかっています。Maven の出力をトレースして、javac オプションを確認できますか?

エラーが発生しても、100% 安全というわけではありません。ここでスペースが不足しているため、回答を投稿する必要があります。これは私が遭遇した逸話的なアカウントです。Java 1.4 と Java 5 を特徴としていますが、それでも問題が発生する理由を明確にするのに役立ちます。

この逸話は、ライブラリを消費者と同じ (またはそれよりも低い) レベルに維持し、常に適切な JDK でコンパイルするように努めるべきであるという意見を裏付けるのに役立ちます。

とにかく、ここに行きます。new java.math.BigInteger(1)Java 1.4の行をコンパイルするとします。1.4 ターゲットで Java 5 コンパイラを使用しているため、すべてが適切に聞こえます。しかし、Java 5 コア ライブラリには引数BigIntegerを取るコンストラクタが含まれてintいるため、クラスはそのコンストラクタへの参照を使用して構築されます。残念ながら、Java 1.4 にはこのバージョンのBigIntegerコンストラクターがないため、後でこのコードを 1.4 JVM で実行すると、ランタイム エラーが発生します。適切な Java 1.4 コンパイラーで起こったであろうことは、inttoからの内部キャストdoubleがコンパイラーによって生成され、double を取る適切なコンストラクターを提供することです。

于 2013-01-21T03:24:09.750 に答える