仅包含带有 Spring Boot maven 插件的配置文件的源包和依赖项

Include source package and dependency only for a profile with Spring Boot maven plugin

在我的一个基于 Spring Boot 的项目中,我想从同一个项目创建两个不同的构建。

生成哪个构建的决定应来自 maven 配置文件。

我想创建一个包含特定文件夹 src/main/java/com/example/demo/full 和特定依赖项的构建(完整),以及不包含的第二个构建(defaultlight)构建包括他们。

包含构建 full 的依赖项可以工作,但我不知道如何确保文件夹 src/main/java/com/example/demo/full 仅针对 full 构建编译。

这是我的 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>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.3.RELEASE</version>
    </parent>

    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>1.0</version>
    <packaging>jar</packaging>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <build>
        <finalName>demo</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <useSystemClassLoader>false</useSystemClassLoader>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <profiles>
        <profile>
            <id>full</id>
            <dependencies>
                <dependency>
                    <groupId>org.apache.poi</groupId>
                    <artifactId>poi-ooxml</artifactId>
                    <version>3.16</version>
                </dependency>
            </dependencies>
        </profile>
    </profiles>

</project>

我如何设法让提到的源文件夹只为配置文件 full 编译?

添加第二个 src 文件夹,例如 scr\foo,然后在 maven 中添加一个配置文件,配置这个 src 文件夹。

<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">

<build>
    ...
</build>

<profiles>
    <profile>
        <id>extraSource</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>build-helper-maven-plugin</artifactId>
                    <version>3.0.0</version>
                    <executions>
                        <execution>
                            <id>add-source</id>
                            <phase>generate-sources</phase>
                            <goals>
                                <goal>add-source</goal>
                            </goals>
                            <configuration>
                                <sources>
                                    <source>src/foo/</source>
                                </sources>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

此处使用 Build Helper Plugin plugin for maven. As it is embedded in the build section of the specific profile 添加源文件夹,它仅在使用此配置文件执行 maven 时处于活动状态(请参阅激活部分)

如果此依赖项是您不能提供 ID 的父项的一部分,则禁用您的 maven-source-plugin 之一会出现问题,我建议将阶段 none 与此代码一起用于其中之一您的 pom.xml 个文件将禁用此功能。

我也推荐使用命令:mvn -Prelease-profile help:effective-pom 如果您的代码中有两个依赖项 maven-source-plugin 则打印,如果是,请使用以下代码禁用其中一个:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-source-plugin</artifactId>
    <executions>
      <execution>
        <id>attach-sources</id>
        <phase>none</phase>
      </execution>
    </executions>
  </plugin>