2014-03-03 57 views
1

我想覆盖另一个人的项目,使用特定文件的自定义(即一个文件将使用不同的控制器,或以一种方式显示或有不同的过程)。我们一直在使用一个覆盖文件,它将我存储库中的所有文件都覆盖,并将所有文件覆盖在文件的顶部,这样我的一小组定制仍然像大型项目一样工作。到目前为止,我们已经完成了它,但它对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的

+0

它是一个网络应用程序吗?你正在重建他们的应用程序吗?如果是这样,你可以添加你的项目作为战争覆盖使用基本的Maven。 –

+0

这是一个网络应用程序,我只是对某些文件进行自定义。所以像罐子和资源中的东西。我试图使用战争覆盖,但它没有得到正确的xwork xml文件 – user1760412

回答

0

所以,我想出了一个解决方案,允许我覆盖工件而不会搞乱源目录。我并没有将所有想要叠加在工件文件上的文件打包,而是实现了一种更简单的方式,即扩展工件,删除重复的类/资源,并将其用作其他源。我创建了自己的插件,它需要尽可能多的“源”目录,并按加载的顺序对它们进行过滤。

<build> 
    <plugins> 
     <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>${additional-source-folder}</outputDirectory> 
          </artifactItem> 
         </artifactItems> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
     <plugin> 
      <groupId>mn-stateadvantage</groupId> 
      <artifactId>duplicateSourceRemover-maven-plugin</artifactId> 
      <version>1.0-SNAPSHOT</version> 
      <executions> 
       <execution> 
        <goals> 
         <goal>removeDuplicates</goal> 
        </goals> 
        <phase>generate-sources</phase> 
        <configuration> 
         <sourceDirectories> 
          <param>src/main</param> 
          <param>${additional-source-folder}</param> 
         </sourceDirectories> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
     <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>build-helper-maven-plugin</artifactId> 
      <version>1.8</version> 
      <executions> 
       <execution> 
        <id>add-source</id> 
        <phase>generate-resources</phase> 
        <goals> 
         <goal>add-source</goal> 
        </goals> 
        <configuration> 
         <sources> 
          <source>${additional-source-folder}</source> 
         </sources> 
        </configuration> 
       </execution> 
       <execution> 
        <id>add-resource</id> 
        <phase>generate-resources</phase> 
        <goals> 
         <goal>add-resource</goal> 
        </goals> 
        <configuration> 
         <resources> 
          <resource> 
           <directory>${additional-source-folder}</directory> 
           <excludes> 
            <exclude>**/*.java</exclude> 
           </excludes> 
          </resource> 
         </resources> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 
0

我们使用maven war叠加功能(read about it here)来执行此操作。要做到这一点,我们只需要将我们的Web客户端模块依赖于战争类型<type>war</type>,并覆盖我们模块中需要的内容。 Maven将获取依赖战争的内容并使用它的文件为我们的Web客户端提供内容,但是如果文件名发生冲突,它将从我们的Web客户端获取文件,而不是从依赖的jar中获取文件。就好像它需要依赖的jar并覆盖我们的客户端以产生新的战争。我们这样做很简单,没有任何需要使用maven的蚂蚁运行 - 我从来不必诉诸于antrun(我认为它是一个反模式)。

你在评论中提到你有一个单独的问题处理一些XML文件。这可以通过资源插件来处理,如果你告诉它你的文件在哪个目录下,并且给它一个通配符来定义你需要复制的文件。

+0

这是否需要位于覆盖的jar中的所有Java源代码和Web应用程序资源文件,并将它们与我的定制结合起来?我的目标是包括每个文件。 – user1760412

+0

我应该让自己的声明更清楚,这是一个模块,是一个Web应用程序的一部分。正在构建的模块和它覆盖的模块都是jar的 – user1760412

+0

然后这个答案是错误的,你应该把它投票,让其他人知道,你应该更新你的问题,使你的最后一点更清晰。 –