反应堆构建和子构建期间的资源路径(Maven)

时间:2015-08-02 19:08:25

标签: xml bash maven

如何构建构建期间使用的资源的路径(特别是验证阶段),因此可以找到maven是直接在reactor根目录还是在子模块上执行的?< / p>

项目文件

UniBldResLocPrb/pom.xml # Reactor/Aggregation POM

UniBldResLocPrb/modules/parent/pom.xml
UniBldResLocPrb/modules/parent/src/main/resources/javaHeaderRegexTemplate.txt
UniBldResLocPrb/modules/parent/src/main/resources/checkstyle.xml

UniBldResLocPrb/modules/child/pom.xml

方案

我需要插入资源的路径( javaHeaderRegexTemplate.txt ) - 绝对或相对于maven执行CWD - 到另一个资源( checkstyle.xml )。这是在 parent / pom.xml 中配置的。 这条路径(相对,因为我不知道如何将其作为绝对值)根据我是直接构建子项目还是通过反应器而改变。

正确的路径:

  • 子项构建:../parent/src/main/resources/javaHeaderRegexTemplate.txt
  • reactor build:modules/parent/src/main/resources/javaHeaderRegexTemplate.txt

我无法配置我的POM,因此这两个版本都可以正常工作。

直接构建孩子时没有问题:

cd UniBldResLocPrb/modules/child/
mvn verify
    [INFO] BUILD SUCCESS

但是当通过反应堆POM建造时它失败了:

cd UniBldResLocPrb/
mvn verify
    [INFO] BUILD FAILURE
    [ERROR] Failed to execute goal org.apache.maven.plugins:maven-checkstyle-plugin:2.15:check (default) on project myproj-child: Failed during checkstyle configuration: cannot initialize module RegexpHeader - unable to load header file ../parent/src/main/resources/javaHeaderRegexTemplate.txt -> [Help 1]

如果我在子POM中手动设置<root.basedir>modules/parent</root.basedir>,那么只有反应堆构建成功,而子构建失败。

这个问题最接近我的问题:Maven Project Aggregation and Variables 但是接受的答案不适用,因为检查文件的配置文件激活始终将子项目用作CWD,即使maven执行CWD是reactor项目的那个。

我正在使用Maven 3.0.5进行测试。

示例项目来源

我做了一个最小的例子,展示了我尝试过的以及失败的原因。

GitHub项目:https://github.com/ProblemExamples/UniBldResLocPrb

或:

git clone https://github.com/ProblemExamples/UniBldResLocPrb.git

来源的重要部分(如github上)

UniBldResLocPrb / pom.xml的

    <properties>
        <!-- NOTE This will be overwritten by the child module. -->
        <root.basedir>modules/parent</root.basedir>
    </properties>

UniBldResLocPrb /模块/子/ pom.xml的

    <properties>
        <!--
            NOTE This is alwasy in effect, but it is only valid if maven is executed
            on this POM directly.
        -->
        <root.basedir>${project.parent.relativePath}</root.basedir>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-checkstyle-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <!-- Execute during the maven "verify" phase (`mvn verify`) -->
                            <goal>check</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

UniBldResLocPrb /模块/父/ SRC /主/资源/ checkstyle.xml

    <!-- NOTE the used variable is supplied by the invocation in maven! -->
    <module name="RegexpHeader">
        <property name="headerFile" value="${java.header.regex.template.file}"/>
    </module>

UniBldResLocPrb /模块/父/ pom.xml的

    <properties>
        <!--
            NOTE This would be overwritten by the child module,
            so it has no effect in this particular example project,
            as we do not use this variable in this POM during the build.
        -->
        <!--<root.basedir>${project.basedir}</root.basedir>-->
    </properties>

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-checkstyle-plugin</artifactId>
                    <version>2.15</version>
                    <configuration>
                        <configLocation>src/main/resources/checkstyle.xml</configLocation>
                        <propertyExpansion>java.header.regex.template.file=${root.basedir}/src/main/resources/javaHeaderRegexTemplate.txt</propertyExpansion>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>

1 个答案:

答案 0 :(得分:1)

我最终只在父POM中设置了这个单一属性。

<properties>
    <!-- NOTE This works for reactor/aggregation & child module builds. -->
    <root.basedir>${project.basedir}/../parent</root.basedir>
</properties>

这是有效的,因为${project.basedir}似乎扩展到绝对路径, 即使maven在反应堆POM上执行,也始终是正在建造的实际项目。在我的例子中,要构建的项目(将使用${root.basedir}属性)将始终是子项目。它们都位于&#34; modules /&#34;下面,所以去&#34; ../ parent&#34;从他们的道路上工作得很好。

${root.basedir}将包含以下内容:

&#34; /家庭/用户/项目/ UniBldResLocPrb /模块/子/../父&#34;

感谢用户 Gerold Broser Vic 向我们提供了这个答案。