将JVM args传递给maven surefire,条件是构建Java版本?

时间:2016-03-16 18:06:25

标签: maven maven-surefire-plugin

是否有一种方法可以将此argLine配置传递给maven-surefire插件,只有在为{ 1.7 配置<jdk.version>1.7</jdk.version>时才会这样,但是当用户更改要为java 1.8 配置pom.xml

原因是Java 1.8 没有permgen空间。

<argLine>-Xmx1024m -XX:MaxPermSize=256m</argLine>

2 个答案:

答案 0 :(得分:2)

您应该使用基于JDK的激活,而不是属性。

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.sample</groupId>
    <artifactId>sample-project</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <jdk.version>1.7</jdk.version>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <source>${jdk.version}</source>
                    <target>${jdk.version}</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <profiles>
        <profile>
            <id>surefire-java7</id>
            <activation>
                <jdk>(,1.8)</jdk>
            </activation>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-surefire-plugin</artifactId>
                        <version>2.19.1</version>
                        <configuration>
                            <argLine>-Xmx1024m -XX:MaxPermSize=256m</argLine>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>
        <profile>
            <id>surefire-java8</id>
            <activation>
                <jdk>1.8</jdk>
            </activation>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-surefire-plugin</artifactId>
                        <version>2.19.1</version>
                        <configuration>
                            <argLine>-Xmx1024m</argLine>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>
</project>

Cf maven文档。 http://maven.apache.org/guides/introduction/introduction-to-profiles.html http://maven.apache.org/enforcer/enforcer-rules/versionRanges.html

答案 1 :(得分:1)

您可以根据属性值使用Maven profile activation,在这种情况下,属性将为jdk.version,其值为JDK的不同配置。然后,配置文件将相应地更改Maven Surefire插件配置。

因此,您的pom可能如下所示:

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.sample</groupId>
    <artifactId>sample-project</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <jdk.version>1.7</jdk.version>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <source>${jdk.version}</source>
                    <target>${jdk.version}</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <profiles>
        <profile>
            <id>surefire-java7</id>
            <activation>
                <property>
                    <name>jdk.version</name>
                    <value>1.7</value>
                </property>
            </activation>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-surefire-plugin</artifactId>
                        <version>2.19.1</version>
                        <configuration>
                            <argLine>-Xmx1024m -XX:MaxPermSize=256m</argLine>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>
        <profile>
            <id>surefire-java8</id>
            <activation>
                <property>
                    <name>jdk.version</name>
                    <value>1.8</value>
                </property>
            </activation>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-surefire-plugin</artifactId>
                        <version>2.19.1</version>
                        <configuration>
                            <argLine>-Xmx1024m</argLine>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>
</project>

请注意最后的profiles部分。定义了两个配置文件:

  • surefire-java7:它会被1.7变量的值jdk.version激活,并为具有所需值的Maven Surefire插件设置argLine
  • surefire-java8:它会被1.8变量的值jdk.version激活,并为Maven Surefire插件设置不同的argLine

另请注意,使用此配置,您甚至可以根据需要从命令行切换JDK版本(以及Surefire配置),如下所示:

mvn clean test -Djdk.version=1.8

关联的个人资料将作为构建的一部分自动激活。

关于交叉编译的重要说明(您可能已经知道它,但以防万一)我建议您仔细阅读this question/answer