【问题标题】:Maven: How to get nested resource with partial directory structure to WEB-INF/classes in mavenMaven:如何将具有部分目录结构的嵌套资源获取到 Maven 中的 WEB-INF/类
【发布时间】:2014-04-23 09:28:01
【问题描述】:

我正在将一个非 Maven 项目迁移到 Maven 项目。我无法更改项目的当前目录结构或创建的 war 文件的结构。 现在我想在 pom.xml 中配置资源的源文件夹和目标文件夹的位置。这将允许我通过调用“mvn clean install”来自动化构建,并且将创建与现有结构的战争。

下面是项目目录结构。

Project Root>\services\**\**\src\**\**\**\abc.xml

Project Root>\services\**\src\abc.xml

Project Root>\services\**\**\**\**\**\src\**\**\abc.xml

Project Root>\services\**\**\xyz\abc.xml

Project Root>\services\**\xyz\abc.xml

Project Root>\services\**\**\**\**\**\xyz\abc.xml

Project Root>pom.xml

现在我希望所有“src”文件夹中的所有 xml 文件,无论它们的位置如何,都应该进入我的“target\webapp\WEB-INF\classes”文件夹。文件应带有位于 classes 文件夹中“src”文件夹之后的目录结构(即 src 的子目录结构)。

<resources>
    <resource>
        <directory>services/**/src</directory>
    </resource>
</resources>

我将非常感谢您的帮助。


以防万一需要以下信息:

我在默认情况下使用 java 源文件得到这种行为。 我设置了下面的行

<sourceDirectory>services</sourceDirectory>

以下格式的所有java文件都被编译,“class”文件被放置在webapp/WEB-INF/classes文件夹中,目录结构在“src”文件夹之后。

Project Root>\services\**\**\src\**\**\**\abc.java

Project Root>\services\**\src\abc.java

Project Root>\services\**\**\**\**\**\src\**\abc.java

Project Root>\services\**\**\xyz\abc.java

Project Root>\services\**\xyz\abc.java

Project Root>\services\**\**\**\**\**\xyz\abc.java

【问题讨论】:

    标签: maven maven-3 maven-plugin maven-assembly-plugin maven-war-plugin


    【解决方案1】:

    你最好使用现有的插件。查看 maven-war 插件:

    https://maven.apache.org/plugins/maven-war-plugin/

    只需将这个东西放在你的 pom 的构建部分:

    <plugin>
       <artifactId>maven-war-plugin</artifactId>
       <version>2.4</version>
    </plugin>
    

    它将获取 src 目录中的所有文件并将它们放在 WEB-INF/classes 中。如果你想在 WEB-INF/classes 之外添加类文件(你不应该这样做,因为你应该坚持标准的 maven 目录结构),你也可以这样做:

    <plugin>
       <artifactId>maven-war-plugin</artifactId>
       <version>2.4</version>
       <configuration>
          <webResources>
              <resource>
                <!-- this is relative to the pom.xml directory -->
                <directory>service**</directory>
               </resource>
           </webResources>
        </configuration>
    </plugin>
    

    下面是关于过滤结果的更多信息,尽管您不需要它:

    https://maven.apache.org/plugins/maven-war-plugin/

    【讨论】:

    • 这是将服务中的任何内容添加为 WEB-INF 文件上方的 Web 资源。但是,我需要将 xml 文件添加到 WEB-INF/classes 文件夹。另请注意,我只需要 src 文件夹之后的目录结构。
    • 您可以结合使用 maven.apache.org/plugins/maven-resources-plugin/examples/… 和 maven war 插件。但是,您应该做的是创建一个标准的目录结构,而不是这样做。我不相信有一个合理的理由让你想要这么多目录。
    【解决方案2】:
    Finally I found that maven does not support this out of box.
    To strip the parent directory structure and keep only the child directory structure when copying resources.
    
    Hence took the help of "maven-antrun-plugin". 
    
    Posting the below snipped to pom.xml and ant build.xml, in case anybody else need it.
        ----------------------pom.xml------------------------------------
        <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-antrun-plugin</artifactId>
                        <version>1.7</version>
                        <executions>
                            <execution>
                                <id>compile</id>
                                <phase>compile</phase>
                                <configuration>
                                    <target>
                                    <echo message="calling ant file ${basedir}/build.xml" />
                                        <ant antfile="${basedir}/build.xml" target="add-service-resources" />
                                        <echo message="called ant file ${basedir}/build.xml" />
                                    </target>
                                </configuration>
                                <goals>
                                    <goal>run</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
        -------------------ant build.xml-----------------------------
            <target name="add-service-resources" description="add service resources">
                <copy todir="./target/classes" overwrite="true">
                    <fileset dir="./services">
                        <include name="**/src/**"/>
                        <exclude name="**/*.java"/>
                        <exclude name="**/*.class"/>
                        <exclude name="**/servicedef.xml"/>
                    </fileset>
                     <cutdirsmapper dirs="2"/><!-- to strip parent directory structure-->
                </copy>
            </target>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-17
      相关资源
      最近更新 更多