2016-08-03 113 views
0

我正在使用最新的maven 3.3.9,它強制執行java 8,並嘗試使用java 7 maven工具鏈編譯java 7中的項目。Maven工具鏈沒有在構建中被觸發

按照:The maven guide我已經放入Maven工具鏈插件來嘗試並告訴它使用Java 7來編譯應用程序。我的項目設置如下:

  • top_module - >(已經把Maven的工具鏈的插件在這個pom.xml中)

    --- submodule1

    --- submodule2

這是我父母的pom.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <parent> 
     <groupId>parent</groupId> 
     <artifactId>build-base</artifactId> 
     <version>1.0.17</version> 
    </parent> 

    <groupId>top_module</groupId> 
    <artifactId>top_module</artifactId> 
    <version>1</version> 
    <packaging>pom</packaging> 
    <name>${project.artifactId}</name> 

    <modules> 
     <module>submodule1</module> 
     <module>submodule2</module> 
    </modules> 

    <properties> 


     ... 

    </properties> 

    <dependencyManagement> 
     <dependencies> 

      <dependency> 
       ... 
      </dependency> 
      <dependency> 
       ... 
      </dependency> 
     </dependencies> 
    </dependencyManagement> 

    <dependencies> 
     <dependency> 
      ... 
     </dependency> 
    </dependencies> 

    <build> 
     <pluginManagement> 
      <plugins> 
       <!-- Ensure we compile as the correct jdk version --> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-compiler-plugin</artifactId> 
        <version>3.1</version> 
       </plugin> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-toolchains-plugin</artifactId> 
        <version>1.1</version> 
        <executions> 
         <execution> 
          <goals> 
           <goal>toolchain</goal> 
          </goals> 
         </execution> 
        </executions> 
        <configuration> 
         <toolchains> 
          <jdk> 
           <version>1.7</version> 
           <vendor>sun</vendor> 
          </jdk> 
         </toolchains> 
        </configuration> 
       </plugin> 

       <!-- Maven WAR Plugin --> 
       <plugin> 
        <artifactId>maven-war-plugin</artifactId> 
        <version>${maven.war.plugin.version}</version> 
        <inherited>true</inherited> 
        <configuration> 
         <archiveClasses>true</archiveClasses> 
        </configuration> 
       </plugin> 

       <plugin> 
        <groupId>org.eclipse.m2e</groupId> 
        <artifactId>lifecycle-mapping</artifactId> 
        <version>1.0.0</version> 
        <configuration> 
         <lifecycleMappingMetadata> 
          <pluginExecutions> 
           <pluginExecution> 
            <pluginExecutionFilter> 
             <groupId>org.apache.maven.plugins</groupId> 
             <artifactId>maven-enforcer-plugin</artifactId> 
             <versionRange>[1.0.0,)</versionRange> 
             <goals> 
              <goal>enforce</goal> 
             </goals> 
            </pluginExecutionFilter> 
            <action> 
             <ignore /> 
            </action> 
           </pluginExecution> 
          </pluginExecutions> 
         </lifecycleMappingMetadata> 
        </configuration> 
       </plugin> 

      </plugins> 
     </pluginManagement> 
    </build> 

    ... 

</project> 

由於插件與java 8不兼容,運行mvn clean install時,構建不會運行任何工具鏈相關步驟,因此顯然意味着工具鏈沒有運行。我需要其他東西嗎?

這是我M2_HOME我toolchains.xml文件:

<?xml version="1.0" encoding="UTF8"?> 
    <toolchains> 
     <!-- JDK toolchains --> 
     <toolchain> 
     <type>jdk</type> 
     <provides> 
      <version>1.6</version> 
      <vendor>sun</vendor> 
     </provides> 
     <configuration> 
      <jdkHome>C:\Java\jdk1.6.0_45</jdkHome> 
     </configuration> 
     </toolchain> 

      <toolchain> 
     <type>jdk</type> 
     <provides> 
      <version>1.7</version> 
      <vendor>sun</vendor> 
     </provides> 
     <configuration> 
      <jdkHome>C:\Java\jdk1.7.0_79</jdkHome> 
     </configuration> 
     </toolchain> 
    </toolchains> 

回答

5

的問題只是涉及您所定義在pluginManagement所有插件,但你需要定義他們是這樣的:

<build> 
    <pluginManagement> 
    <plugins> 
     <!-- Ensure we compile as the correct jdk version --> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-compiler-plugin</artifactId> 
     <version>3.1</version> 
     </plugin> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-toolchains-plugin</artifactId> 
     <version>1.1</version> 
     </plugin> 

     <!-- Maven WAR Plugin --> 
     <plugin> 
     <artifactId>maven-war-plugin</artifactId> 
     <version>${maven.war.plugin.version}</version> 
     <inherited>true</inherited> 
     <configuration> 
      <archiveClasses>true</archiveClasses> 
     </configuration> 
     </plugin> 

     <plugin> 
     <groupId>org.eclipse.m2e</groupId> 
     <artifactId>lifecycle-mapping</artifactId> 
     <version>1.0.0</version> 
     <configuration> 
      <lifecycleMappingMetadata> 
      <pluginExecutions> 
       <pluginExecution> 
       <pluginExecutionFilter> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-enforcer-plugin</artifactId> 
        <versionRange>[1.0.0,)</versionRange> 
        <goals> 
        <goal>enforce</goal> 
        </goals> 
       </pluginExecutionFilter> 
       <action> 
        <ignore /> 
       </action> 
       </pluginExecution> 
      </pluginExecutions> 
      </lifecycleMappingMetadata> 
     </configuration> 
     </plugin> 

    </plugins> 
    </pluginManagement> 
    <plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-toolchains-plugin</artifactId> 
     <executions> 
     <execution> 
      <goals> 
      <goal>toolchain</goal> 
      </goals> 
      <configuration> 
      <toolchains> 
       <jdk> 
       <version>1.7</version> 
       <vendor>sun</vendor> 
       </jdk> 
      </toolchains> 
      </configuration> 
     </execution> 
     </executions> 
    </plugin> 
    </plugins> 


</build> 

... 

</project> 

pluginManagement旨在定義版本和默認配置,但沒有結合到你需要的Maven的工具鏈,插件做lifeycle。在pluginManagement中,你應該定義你正在使用的所有插件,這意味着maven-resources-plugin,maven-install-plugin,maven-deploy-plugin,maven-enforcer-plugin等。這可能是一個很好的公司候選人父pom定義了所有這些東西。 而你正在分離Maven使用的JDK和代碼使用的JDK的最佳方式。

除此之外Maven 3.3.9 needs JDK 7最小和 JDK 8

+0

謝謝!是的,這是因爲它是在插件管理。此外,我還以爲我記得讀過某個地方,maven 3.3.9強制Java 8,但感謝指出:) – Pete

-1

如果你只是想行家使用java JDK 7的時候,工具鏈的插件可能會比你更需要。它可能足以設置JAVA_HOME

確保JAVA_HOME設置爲您的JDK的位置,例如, export JAVA_HOME =/usr/java/jdk1.7。*並且$ JAVA_HOME/bin位於PATH環境變量中。 (或者,如果從日食,將其設置爲工作區的默認值)

如果你想從僅有1個項目切換JDK,您還可以使用compilerVersion標籤 https://maven.apache.org/plugins/maven-compiler-plugin/examples/compile-using-different-jdk.html

+0

工具鏈是Maven中去的最佳和correctes方式。使用JAVA_HOME爲Maven定義了JDK,併爲您的代碼定義了可能不符合您需要的代碼。除了compilerVersion標記不是更改要使用的JDK的正確方法。所以你只用它來編譯,而不是用來運行可能導致問題的例子。 – khmarbaise