2015-03-13 58 views
0

我有一個pom.xml具有以下<build>申報一個項目:安裝和編譯Java的Maven構件8

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.1</version> 
      <configuration> 
       <source>1.8</source> 
       <target>1.8</target> 
       <encoding>UTF-8</encoding> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

當我運行mvn install在這個項目上,它編譯項目,運行單元測試和發佈它到我的本地回購。我想了解一些關於Maven的在這裏,和我有一個艱難的時間在以下查找文檔/解釋:

  • 我怎麼能跑mvn install,如果POM不build/plugins下其聲明? maven-compiler-plugin是否包含maven-install-plugin,如果是的話,我怎麼能想出來呢?
  • 最重要的是build/plugins/plugin/configuration/source.../target的值都設置爲1.8。如果我的機器上有Java 8,並且我在此項目上運行mvn install沒有任何錯誤,那麼是否保證項目使用Java 8構建?我正在查看docs for the Compiler Plugin,並且沒有看到那些source/target配置在任何地方列出。
+1

對於文檔看這裏:http://maven.apache.org/plugins/maven-compiler-plugin/compile-mojo.html – khmarbaise 2015-03-13 15:00:45

+0

謝謝@khmarbaise(+1) - 從該鏈接我找到了[生命週期文檔](http://maven.apache.org/ref/3.2.5/maven-core/lifecycles.html),並且看到'compile'是'install'的上游,這就解釋了爲什麼要執行'install'觸發器一個「編譯」。然而,它並沒有解釋爲什麼POM聲明編譯器插件,而不是安裝插件。思考? – smeeb 2015-03-13 15:04:48

+0

@smeeb,因爲它不必。 maven捆綁了一個編譯和一個安裝插件 - 它們是內置的。幾乎每個Maven版本都附帶了這些插件的不同版本。您可能會更改版本或對其進行配置,但您不必這樣做。例如。如果你想告訴編譯插件_how_(哪個語言級別)編譯。 – Alexander 2015-03-13 22:42:27

回答

4

首先您應該瞭解構建生命週期是什麼以及它是如何工作的以及插件are bound to the life cycle by default

此外,您應該瞭解,在Maven中,每個項目都繼承自作爲maven發行版(您下載的軟件包)一部分的super pom文件。超級pom定義了默認的文件夾佈局和一些插件版本。

與你一樣定義maven-compiler-plugin的問題是非常準確,只是錯誤。你應該像下面這樣定義它:

<build> 
    <pluginManagement> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <configuration> 
       <source>1.8</source> 
       <target>1.8</target> 
       <encoding>UTF-8</encoding> 
      </configuration> 
     </plugin> 
    </plugins> 
    </pluginManagement> 
</build> 

這將覆蓋超級pom繼承的定義並更改它的配置。在你的情況我建議修改定義成這樣:在全球範圍的原因有哪些使用這個定義,如maven-resources-plugin其他插件

<project> 
    ... 
    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 

    <build> 
     <pluginManagement> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.2</version> 
       <configuration> 
        <source>1.8</source> 
        <target>1.8</target> 
       </configuration> 
      </plugin> 
     </plugins> 
     </pluginManagement> 
    </build> 
    .. 
    </project> 

編碼應設置。上述屬性的使用簡化了這一點,導致每個具有編碼選項的插件都將使用default as defined in the property

爲了確保使用正確版本的Java(您的計算機上的JDK),必須使用maven-enforcer-plugin

除此之外,請看看plugins page which shows the most up-to-date releases of the plugins

作爲一個很好的文檔,我可以推薦Books on Maven,但請注意,它們是以Maven 2爲基礎編寫的。所以如果有什麼不清楚的話,請在SO上的用戶郵件列表上詢問。

+0

Thanks @khmarbaise(+1) - 這真是一個非常好的答案,我絕對會深入瞭解你發佈的所有鏈接。謝謝!然而,在短期內,我仍然不完全理解編譯器插件的'1.8'聲明。我想確保我的庫在Java 8上編譯和打包(構建)。根據您的建議更改,運行'mvn install'會成功證明這一點嗎?再次感謝! – smeeb 2015-03-13 15:20:58

+0

您必須知道,例如,JDK 9 javac編譯器也具有選項'source'和'target',並且可用於生成Java 1.7兼容的類文件。但是,這可能與真正使用Java 1.7編譯器編譯這些類不同。上面也是這樣。如果您確實需要確保(100%)使用JDK 8,則必須通過maven-enforcer插件進行操作,並檢查安裝的JDK是否爲您期望的版本。 – khmarbaise 2015-03-14 12:09:39