【问题标题】:Copying and overwriting some resources with maven in a profile在配置文件中使用 maven 复制和覆盖一些资源
【发布时间】:2018-05-14 06:49:57
【问题描述】:

我有两个项目,它们是从一个 maven 多项目构建的,项目 A 和项目 B。项目 B 最近上线,与项目 A 差别不大,即它使用了几个不同的配置文件。我的想法是为 projectB 创建配置文件并添加其他配置文件/替换现有配置文件。我在 stackoverflow 上尝试了几种方法,包括复制重命名插件和 mvn 依赖插件。部分问题似乎是两个项目都有一个具有相同配置名称的文件。

我当前/最后的方法是通过以下方式使用 maven-resources-plugin: 我创建了一个附加目录:src/main/projectbresources 和一个 projectbprofile:

        <profile>
        <id>projectb</id>
        <activation><activeByDefault>false</activeByDefault></activation>
        <build>
            <plugins>
                <plugin>
                    <artifactId>maven-resources-plugin</artifactId>
                    <version>3.0.2</version>
                    <executions>
                        <execution>
                            <id>copy-resources</id>
                            <!-- here the phase you need -->
                            <phase>validate</phase>
                            <goals>
                                <goal>copy-resources</goal>
                            </goals>
                            <configuration>
                                <outputDirectory>${project.build.directory}/${project.build.finalName}/WEB-INF/classes</outputDirectory>
                                <resources>
                                    <resource>
                                        <directory>src/main/projectbresources</directory>
                                        <filtering>true</filtering>
                                    </resource>
                                </resources>
                                <overwrite>true</overwrite>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
            </build>
    </profile>

我在 src/main/resources 和 src/main/projectbresources 中都有一个同名的文件,但是,无论我使用什么配置文件构建,来自 src/main/resources 的文件始终位于目标文件夹中。仅将 projectbresources 中的其他文件复制到目标。

【问题讨论】:

  • 为什么在两个位置有同一个文件?问题是文件里面有什么?你想达到什么目标?

标签: java maven build resources copy


【解决方案1】:

根据您的说法“项目 B 最近上线,与项目 A 差别不大,即它使用了几个不同的配置文件。”我会说你不需要 2 个单独的项目。您只能拥有一个项目,并根据激活的配置文件选择不同的配置。使用这种方法,两种情况的配置文件可以具有相同的名称但不同的内容。

您的项目结构将如下所示(作为示例):

项目根文件夹:

pom.xml
- src
-- main
--- resources-profileA
--- resources-profileB

现在,pom.xml 包含 2 个配置文件:profileA 和 profileB。每个配置文件都定义了自己的构建/资源。

<profiles>
    <profile>
        <id>projectA</id>
        <activation>
            <activeByDefault>false</activeByDefault>
        </activation>
        <build>
            <resources>
                <resource>
                    <directory>src/main/resources-profileA</directory>
                </resource>
            </resources>
        </build>
    </profile>
    <profile>
        <id>projectB</id>
        <activation>
            <activeByDefault>false</activeByDefault>
        </activation>
        <build>
            <resources>
                <resource>
                    <directory>src/main/resources-profileB</directory>
                </resource>
            </resources>
        </build>
    </profile>
</profiles>

更多关于这一点,您可以默认激活一个配置文件。这将帮助您的开发环境自动使用一个。如果您希望该配置文件有一个默认的活动配置文件,您可以将资源文件夹命名为 resources(默认 maven 名称),并为第二个配置文件保留不同的名称。

更新:

要“简单”并只添加一些额外的文件,您可以使用 maven 默认配置文件 projectA 并仅为 projectB 定义一个配置文件。

项目根文件夹变为:

pom.xml
- src
-- main
--- resources
--- resources-profileB

并且 pom.xml 默认只包含一个不活动的配置文件:

<profiles>
    <profile>
        <id>projectB</id>
        <activation>
            <activeByDefault>false</activeByDefault>
        </activation>
        <build>
            <resources>
                <resource>
                    <directory>src/main/resources-profileB</directory>
                </resource>
            </resources>
        </build>
    </profile>
</profiles>

如何为这两个配置文件构建:
为无配置文件构建相当于为项目A 构建:

mvn 全新安装

为 projectB 配置文件构建将忽略默认文件夹中的资源,并将仅使用配置文件 (src/main/resources-profileB) 中定义的资源。

mvn clean install -P projectB

【讨论】:

  • 您好,感谢您的回答。我知道我可以使用两组资源制作两个配置文件......我想“简单”并且只为项目 B 添加一些额外的文件而不更改项目 A 构建。但如果一切都失败了,我会按照你的建议回到两个配置文件。
  • @Leon 我更新了我的回复,从您的角度来看,我认为这是“最简单”的解决方案。
  • 这是我的第一种方法,但不是在项目 A 上复制项目 B 资源,而是覆盖了资源设置,并且只包含了项目 B 资源。但我倾向于回退到两个显式文件夹解决方案,从而明确共享和项目特定配置
  • 好吧,我最终想通了,我最终分别为 projecta 和 projectb 创建了两个目录,以及两个 maven 配置文件,但默认情况下激活了 projecta 的一个。所以所有现有的 jenkins 工作等都可以像以前一样构建 projecta,而新工作可以构建 projectb。顺便说一句,我正在使用 maven-resources-plugin 复制资源。
  • @Leon 很高兴能帮到你。
猜你喜欢
  • 2019-04-11
  • 1970-01-01
  • 2011-12-26
  • 1970-01-01
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-27
相关资源
最近更新 更多