我想使用特定文件的自定义来覆盖另一个人的项目(即一个文件将使用不同的 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/