java - 创建 Artifact 叠加

标签 java maven overlay pom.xml

我想使用特定文件的自定义来覆盖另一个人的项目(即一个文件将使用不同的 Controller ,或以一种方式显示某些内容,或具有不同的进程)。我们一直在使用覆盖层来获取存储库中的所有文件,并将所有文件覆盖在其文件之上,以便我的较小的自定义集仍然像较大的项目一样运行。到目前为止,我们已经完成了这样的工作,但它对 IDE 造成了严重破坏。有没有更好的办法?我尝试使用 maven-builder-helper-plugin 但它在我覆盖的 java 文件上给了我重复的类。

<build>
   <sourceDirectory>target/overlay</sourceDirectory>
      <resources>
        <resource>
          <directory>target/overlay</directory>
          <filtering>false</filtering>
          <excludes>
            <exclude>**/*.java</exclude>
          </excludes>
        </resource>
      </resources>
      <plugins>
          <plugin>
            <artifactId>maven-antrun-plugin</artifactId>
            <executions>
              <execution>
                <phase>generate-sources</phase>
                <configuration>
                <tasks>
                    <copy todir="target/overlay" overwrite="true">
                        <fileset dir="src/main/java">
                        </fileset>
                        <fileset dir="src/main/resources">
                        </fileset>
                    </copy>
                </tasks>
                </configuration>
                    <goals>
                        <goal>run</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>unpack</id>
                    <phase>initialize</phase>
                    <goals>
                        <goal>unpack</goal>
                    </goals>
                    <configuration>
                        <artifactItems>
                            <artifactItem>
                                <groupId>com.sample.service</groupId>
                                <artifactId>sampleService</artifactId>  
                                <classifier>sources</classifier>
                                <type>jar</type>
                                <overWrite>true</overWrite>
                                <outputDirectory>target/overlay</outputDirectory>
                            </artifactItem>
                        </artifactItems>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

我应该指出,我完全可以接受与此不同的方向。我只是想不出更好的方法来包含它们所需的所有资源和源文件,以保持项目正常运行。这是针对属于 Web 应用程序一部分的模块。正在构建的模块和它覆盖的模块都是 jar 的

最佳答案

我们使用 Maven war 覆盖功能 ( read about it here ) 来完成此操作。为此,我们只需将 Web 客户端模块依赖于 war 类型 <type>war</type> ,并覆盖我们模块中需要的内容。 Maven 将获取依赖 war 的内容并使用其文件为我们的 Web 客户端提供内容,但如果文件名存在冲突,它将从我们的 Web 客户端获取文件,而不是从依赖的 jar 中获取文件。就好像它需要依赖的 jar 并将我们的客户端覆盖在它上面以产生新的 war 。我们这样做非常简单,不需要 ant run —— 在使用 Maven 的多年里,我从来没有必要求助于 antrun (我认为它是一种反模式)。

您在评论中提到您在处理某些 xml 文件时遇到了单独的问题。这可以由资源插件处理,如果你告诉它你的文件位于哪个目录,并给它一个通配符来定义你需要复制的文件。

关于java - 创建 Artifact 叠加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22155911/

相关文章:

java - 关于使用 Ebean 的 Play Framework 和 MySQL 的简单 CRUD 教程?

java - 我的 Hangman 代码不会立即记录错误的猜测,而是打印双下划线等等

java - 如何在使用 JAXB 后在 XML 中声明属性的顺序,无论是在 Maven 中还是在其他地方

java - 如何为我的项目 war 文件 Web 应用程序定向 IP 地址?

java - 无法发送富文本电子邮件 - Thymeleaf + Spring 4

java - java 如何允许像 Map.Entry 这样的名称?我以为点是不允许的

maven - 与geb的链接错误

ffmpeg 字幕按语言叠加

css - 我希望幻灯片的标题像第二张图片一样垂直显示

ios - 自定义覆盖不透明