2016-08-12 10 views
2

まず、私のタイトルは恐ろしいものであると認めます。私の質問を聞いた後、誰かがより適したタイトルを思いつき、投稿のこの部分を削除したら、それを自由にしてください。Mavenを使ってJavaコンパイルのバージョンを指定する機能

マルチキャッチ例外ブロックのため、最近mvn clean installのコンパイルエラーが発生しました。その苦情error: multi-catch statement is not supported in -source 1.5。かなりストレートです。

-mvn version-java versionの両方が、それは1.8を示し、Java Build Pathjre1.8.Xで私JRE System Libraryを示しJava Compiler1.8でとEclipseで私を示すことを除いて。

この投稿へのリンク:Why can't java 7 use diamond operator and multi-catch statementその回答を試みました。だから私のポンポンの<build><plugins>に私が挿入された:

<plugin> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <version>3.2</version> 
    <configuration> 
      <source>1.8</source> 
      <target>1.8</target> 
    </configuration> 
</plugin> 

は今も元気構築します。基本的なレベルでは、これはコンパイラに、Java 1.8を使うべきであることを伝えていることを理解しています。しかしどうですか?そして、私がこれを私のpom.xmlに入れるまで、他のすべてが1.8に設定されていたことは、一見問題ではありませんでしたか?私はマルチキャッチブロックを持っていなかったので、このプラグインタグの前にうまく構築していたので、何が変わったのですか?

+2

echo%JAVA_HOME%は何を出力しますか? –

+0

@ Jean-FrançoisSavard投稿前にトラブルシューティングを行う場合、実際は同じ考えがありました。それは 'Java 8'でもありましたが、M2_HOMEはJava 7を使っていましたが、これも8に切り替えました。だから、 'Java 6' –

+0

のEclipse設定は、' mvn'の動作や 'mvn'のデフォルト設定に影響を与えませんでした。現在は' 1.5'です。 –

答えて

7

デフォルトでは、Java(編集:具体的にはMaven、この場合はjavacではありません)は、コードを最も妥当な互換バージョン(1.5と仮定)にコンパイルします。したがって、使用しているJavaのバージョンにかかわらず、生成されたバイトコードにはバージョン1.5が残っています。あなたはコンパイルし、1.8 Javaで1.5バージョンのバイトコードを実行することができます、あなたはちょうどそれを逆にすることはできません。

もちろん、Javaの多くの機能は下位互換性があるため、新しい機能(ラムダ、ダイヤモンド、マルチキャッチなど)を追加するまで、コードはコンパイルされて正常に動作します。次に、ターゲットバージョンを手動で指定する必要があります。

+0

Gotchya、よく知っています。私は前に引用したプラグインを見たことがありますが、それが何をしているのか、そしてなぜ、感謝したことは決して分かりませんでした。 –

2

現時点ではこのmaven-compiler-plugindocumentation page

によると、独立してJDKのあなたとMavenを実行し、デフォルトのソースの設定は1.5で、デフォルトの目標設定は1.5です。あなたはこれらのデフォルトを変更したい場合は、ソースを設定し、考慮すべき二つの異なるものがあります

0

ターゲットにする必要があります

Javaのバージョンは、あなたがどのようなターゲットのソース
  • をコンパイルするために使用している何
    1. あなたがソースをコンパイルしています

    使用しているJavaのバージョンは、$ JAVA_HOME環境変数によって決まります。 Mavenはそれがどんなバージョンであってもそこで見つかるjdk/jreを使います。

    パート2では、少し難解です。すべてのJDKは、それまでのバージョンのソースをコンパイルすることができます。ターゲットレベルでは、このコードを実行するために必要な最小Javaバージョンをコンパイラーに通知します。一方、ソースレベルは、コンパイラにどのような構文レベルでソースに許可するかを指示します。

    あなたが使用しているjdk/jreのレベルよりも高いソースレベルまたはターゲットレベルを選択すると、もちろんコンパイルは成功しません。

  • 関連する問題