【问题标题】:Skipping maven shade plugin in a spring-boot project based on maven profile在基于 maven 配置文件的 spring-boot 项目中跳过 maven shade 插件
【发布时间】:2019-12-18 14:10:58
【问题描述】:

我想在 spring-boot 项目上激活某个 maven 配置文件时跳过执行 maven-shade-plugin。正如answer 中提到的,我的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>

    <groupId>com.van.saasinfra</groupId>
    <artifactId>saas-controller</artifactId>
    <version>0.001-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>saas-controller</name>
    <description>SaaS Controller</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.21.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>


    <dependencies>
    ...
    </dependencies>

    <profiles>
        <profile>
            <id>dev-local</id>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>${mvn.shade.plugin.version}</version>
                <executions>
                    <execution>
                        <id>saas-controller-shade</id>
                        <phase>none</phase>
                    </execution>
                </executions>
            </plugin>
        </profile>
    </profiles>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-shade-plugin</artifactId>
            </plugin>
            <plugin>
                <artifactId>maven-antrun-plugin</artifactId>
                <version>1.8</version>
                <executions>
                    <execution>
                        <id>generate-sources</id>
                        <phase>generate-sources</phase>
                        <configuration>
                            <target>
                                <mkdir dir="${project.build.directory}/generated-sources"/>
                                <exec executable="protoc">
                                    <arg value="--java_out=${project.build.directory}/generated-sources"/>
                                    <arg value="--proto_path=${project.basedir}/src/main/proto"/>
                                    <arg value="${project.basedir}/src/main/proto/com/van/saasinfra/saascontroller/saas-controller.proto"/>
                                    <arg value="${project.basedir}/src/main/proto/com/van/saasinfra/saascontroller/billing-controller.proto"/>
                                    <arg value="${project.basedir}/src/main/proto/com/van/saasinfra/saascontroller/node-topology.proto"/>
                                    <arg value="${project.basedir}/src/main/proto/com/van/saasinfra/saascontroller/availability.proto"/>
                                    <arg value="${project.basedir}/src/main/proto/com/van/saasinfra/saascontroller/dynamodb-config.proto"/>
                                    <arg value="${project.basedir}/src/main/proto/com/van/saasinfra/saascontroller/tenant-migration.proto"/>
                                </exec>
                            </target>
                            <sourceRoot>${project.build.directory}/generated-sources/</sourceRoot>
                        </configuration>
                        <goals>
                            <goal>run</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

但即使在执行maven clean install -Pdev-local 时,我仍然看到阴影步骤仍在执行。

有人可以建议在 Spring Boot 项目上启用某个配置文件时如何停止执行阴影吗?

【问题讨论】:

    标签: java spring spring-boot maven java-8


    【解决方案1】:

    有一个专用的Spring Boot Maven Plugin 还允许您重新打包您的应用程序。它的repackage 目标在package 阶段自动激活,因此您甚至不需要定义执行。

    回到你的问题,如果你想跳过某个插件的执行,许多插件都有一个 skip 可以设置的属性。 Spring Boot Maven 插件有一个。您可以在 XML 配置中设置它,但也有一个 user 属性。因此,您的 dev-local 配置文件可能如下所示:

    <profile>
        <id>dev-local</id>
        <properties>
            <spring-boot.repackage.skip>true</spring-boot.repackage.skip>
        </properties>
    </profile>
    

    但您甚至可以完全跳过配置文件并使用 -Dspring-boot.repackage.skip=true 调用 Maven。

    Maven Shade Plugin 没有记录此类属性,因此这可能是使用 Spring Boot Maven 插件而不是 Maven Shade 插件的原因。

    最后,对于构建应用程序,您通常不需要mvn clean install,但mvn verify 就足够了。从长远来看,它不会将构建的工件复制到本地 Maven 存储库(~/.m2/repository%userprofile%\.m2\repository),因此可以节省几秒钟的执行时间并节省大量磁盘空间。

    【讨论】:

    • 我声称没有命令行参数会影响生成的工件。因此,对我来说,maven-shade-plugin 没有跳过参数是有道理的。
    • 这包括激活或停用配置文件吗?
    • 是的。这就是棘手的地方。出于这个原因,大多数 Maven 开发人员都避免使用配置文件,它们变得太强大了。配置文件的有效使用:集成测试(可能需要很长时间),代码覆盖(在构建服务器上激活它)。无效(最差)用法:dev/test/prod。这些暗示嵌入式环境配置。
    猜你喜欢
    • 2018-03-20
    • 2021-10-31
    • 2020-06-17
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    • 2019-08-30
    • 2017-12-21
    • 1970-01-01
    相关资源
    最近更新 更多