2016-08-03 112 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