在执行生命周期的maven命令中排除父级及其子级或模块

时间:2019-01-23 11:29:35

标签: maven maven-3

执行Parent2并不会在Project2儿童的nor模块上应用生命周期。当所有子项目都处于同一级别时,我尝试将Project2Parent2合并到一个父级mvn clean install -pl Parent2中,以仅将其排除在许多生命周期之外。 这怎么办?

类似地 Parent2仅适用于Parent1,而没有其子级/模块!

enter image description here

这是我了解的最新POM。请注意,我唯一的限制是将所有文件夹都保持在同一级别(在<project> <modelVersion>4.0.0</modelVersion> <groupId>any</groupId> <artifactId>Parent1</artifactId> <version>whatever</version> <packaging>pom</packaging> <modules> <module>Parent2</module> <module>Project1</module> </modules> </project> 下)

父母1

<project>
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>any</groupId>
        <artifactId>Parent1</artifactId>
        <version>whatever</version>
    </parent>

    <packaging>pom</packaging>
    <artifactId>Parent2</artifactId>
<modules>
    <module>../Project2</module>
    <module>../Project3</module>
</modules>
</project>

父母2

<project>
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>any</groupId>
        <artifactId>Parent1</artifactId>
        <version>whatever</version>
    </parent>

    <packaging>jar</packaging>
    <artifactId>Project1</artifactId>
</project>

Project1

<project>
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>any</groupId>
        <artifactId>Parent2</artifactId>
        <version>whatever</version>
        <relativePath>../Parent2</relativePath>
    </parent>

    <packaging>jar</packaging>
    <artifactId>Project2</artifactId>
</project>

Project2(Project3完全相同)

public class ShareDialogFragment extends BottomSheetDialogFragment {

        @Nullable
        @Override
        public View onCreateView(final @NonNull LayoutInflater inflater, @Nullable final ViewGroup container, @Nullable final Bundle savedInstanceState) {
            final View rootView = inflater.inflate(R.layout.fragment_share, container, false);
            ButterKnife.bind(this, rootView);
            readArguments();

            return rootView;
        }

        private void readArguments() {
            if (getArguments() != null) {
                sharedImageGridId = getArguments().getLong(Constants.Extra.SHARED_IMAGE_GRID_ID);
                isReadyToShare = getArguments().getBoolean(Constants.Extra.SHARED_IMAGE_IS_READY);
            } else {
       listener.onShareError(R.string.main_activity_share_photo_error);
            }
        }
}

2 个答案:

答案 0 :(得分:1)

我也有兴趣将排除应用于子模块。但是,将mvn clean install -pl Parent2 -amdclean应用于installParent2Project2中,Project3可以按期望的方式工作。但是,正如Pawlcomment所指出的,并根据MNG-5230问题

  

嵌套模块不被父模块排除。排除方法模仿了包含方法,并且其匹配器不支持通配符等。因此要进行级联排除将需要一个额外的标记,例如-amd

     

使用时按以下顺序过滤依存关系图   -pl:
  1.包含的项目+可能是上游和下游
  2.排除的项目
  3.跳过简历项目

     

因此应该有可能直接排除嵌套模块,因为嵌套模块应该在过滤开始之前出现在初始依赖关系图中。

因此无法使用其父/所有者pom排除嵌套模块。这是我解决该问题的方法。只需使用配置文件并在配置文件定义之外完全删除子模块即可解决该问题。

简而言之是使用配置文件来识别模块,并注意无论激活了哪个配置文件,共享在外部配置文件中识别的模块

示例(自OP项目命名起)

父母1 (为澄清起见,已与Project4添加Project1一样

<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>Parent1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>

<profiles>
    <profile>
        <id>multi-modules-profile</id>
        <modules>
            <module>Parent2</module>
            <module>Project2</module>
            <module>Project3</module>
        </modules>
    </profile>
    <profile>
        <id>simple-module-profile</id>
        <modules>
            <module>Project1</module>
        </modules>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>
</profiles>

<modules>
    <module>Project4</module>
</modules>

Project1 (与Project4类似)

<modelVersion>4.0.0</modelVersion>
<parent>
    <groupId>com.example</groupId>
    <artifactId>Parent1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>Project1</artifactId>

父母2

<modelVersion>4.0.0</modelVersion>
<parent>
    <groupId>com.example</groupId>
    <artifactId>Parent1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>Parent2</artifactId>
<packaging>pom</packaging>

Project2 (与Project3类似)

<modelVersion>4.0.0</modelVersion>
<parent>
    <groupId>com.example</groupId>
    <artifactId>Parent2</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>../Parent2</relativePath>
</parent>
<artifactId>Project2</artifactId>

现在运行mvn clean将适用于Parent1Project1Project4,因为Project1在默认情况下处于激活状态的配置文件中(执行)。运行mvn clean -P simple-module-profile具有相同的效果,因为Project4在配置文件定义之外共享。

最后,运行mvn clean -P multi-modules-profile将应用于Parent1Project4Parent2Project2Project3,而Project1哪个是需要的。请注意,Project4始终在其中,因为它在配置文件定义之外。

答案 1 :(得分:0)

编辑:答案仅适用于:

  

类似地,mvn clean install -pl Parent2仅应用于不带子代/模块的Parent2!

使用mvn -pl Parent2 -amd clean install构建Parent2及其所有模块。

请参阅参考资料:https://books.sonatype.com/mvnref-book/reference/_using_advanced_reactor_options.html#_making_project_dependents