How can I disable default lifecycle phases in Maven 3?
Asked Answered
D

1

16

By disable I mean completely, entirely cut the phase from the lifecycle, so that it is not even invoked.

I might need a custom lifecycle but I could not find an easy way to define it straight in my pom.xml. It appears I need to write a plugin just to list phases I want.

For example, I would like default-testResources, default-testCompile and default-test phases to never happen and turn my build log from this:

[INFO] ------------------------------------------------------------------------
[INFO] Building HelpDesk Webapp 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ helpdesk ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory d:\proj\HelpDesk\repo\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.0:compile (default-compile) @ helpdesk ---
[INFO] No sources to compile
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ helpdesk ---
[INFO] Not copying test resources
[INFO]
[INFO] --- maven-compiler-plugin:3.0:testCompile (default-testCompile) @ helpdesk ---
[INFO] Not compiling test sources
[INFO]
[INFO] --- maven-surefire-plugin:2.10:test (default-test) @ helpdesk ---
[INFO] Tests are skipped.
[INFO]
[INFO] --- maven-war-plugin:2.3:war (default-war) @ helpdesk ---
[INFO] Packaging webapp
[INFO] Assembling webapp [helpdesk] in [d:\proj\HelpDesk\repo\target\helpdesk]
[INFO] Processing war project
[INFO] Copying webapp resources [d:\proj\HelpDesk\repo\src\main\webapp]
[INFO] Webapp assembled in [40 msecs]
[INFO] Building war: d:\proj\HelpDesk\repo\target\helpdesk.war
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

into this:

[INFO] ------------------------------------------------------------------------
[INFO] Building HelpDesk Webapp 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ helpdesk ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory d:\proj\HelpDesk\repo\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.0:compile (default-compile) @ helpdesk ---
[INFO] No sources to compile
[INFO]
[INFO] --- maven-war-plugin:2.3:war (default-war) @ helpdesk ---
[INFO] Packaging webapp
[INFO] Assembling webapp [helpdesk] in [d:\proj\HelpDesk\repo\target\helpdesk]
[INFO] Processing war project
[INFO] Copying webapp resources [d:\proj\HelpDesk\repo\src\main\webapp]
[INFO] Webapp assembled in [40 msecs]
[INFO] Building war: d:\proj\HelpDesk\repo\target\helpdesk.war
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
Dingman answered 6/3, 2013 at 14:2 Comment(4)
The question is why do you need such changed life cycle for what purpose?Huron
@Huron Sort of academic interest. I don't like the idea that Maven invokes phases and plugins that I know have no work to do, spending computational resources and adding useless log entries. I am aware that unit tests are considered good practice by Maven, but still wonder if I could disable them. Best way I found so far is maven.test.skip variable that minimized the log to what I posted. The question arose from my expectation of flexibility to adjust Maven to my project, my layout and my build phases. I realize it has minimal, or even unnoticeable performance impact.Dingman
@Huron why can't I maven.package.skip? I have profile which when activated disables my verification plugin. But that's dangerous for me, and I want to prohibit the creation of a package by the JAR/shade/source/etc plugins since they would be incomplete. Basically I want to stop the buildIntercrop
Although I'm not sure about every lifecycle phase, it's possible to skip the test lifecycle phase during the default lifecycle with ``` -Dmaven.skip.test=true ``` See more here: #5785278.Leralerch
D
19

If you want to continue using a predefined packaging (jar, war, etc.) you cannot totally remove them. You may leave the packaging as pom and define your own lifecycle by binding the goals you want to the desired phases, or you may define your own lifecycle entirely. You may also bind a default goal to phase none to prevent the goal from doing any real work as shown.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <executions>
        <execution>
            <id>default-testResources</id>
            <phase>none</phase>
        </execution>
    </executions>
</plugin>

All that said - khmarbaise's question is a good one. Generally it's not a best practice to change the existing pre-built lifecycles.

Danyel answered 6/3, 2013 at 14:49 Comment(4)
With the given solution you only disable the particular plugin but not the life cycle itself.Huron
Agreed, setting phase to none doesn't change the lifecycle. If there are other plugins bound to the same lifecycle phase they will still run. That's why I provided the other ideas as well.Danyel
Found goals listing for bundled packaging types. The page says I need to write a plugin to define custom packaging type and a lifecycle for it. Is this the only way? Cannot I define it straight in a POM for my project with some <lifecycle> tag?Dingman
The goals listing link from @Dingman is broken. I found a saved version on the internet archive.Menander

© 2022 - 2024 — McMap. All rights reserved.