Maven资源不复制文件

时间:2012-01-04 12:42:15

标签: maven-2

我想用maven替换war文件中的一些* .properties文件。

因此我在资源文件夹中创建了文件夹dev,test和prod。现在我只想在执行相应的配置文件时在war文件的资源文件夹路径中使用其中一个文件夹。结果是maven也在复制所有其他文件夹,因此它们在类路径中是双重的。这是我的配置:

<profile>
        <id>dev</id>

        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>

        <build>
            <plugins>
                <plugin>
                    <artifactId>maven-resources-plugin</artifactId>
                    <version>2.3</version>
                    <executions>
                        <execution>
                            <id>copy-dev-resources</id>
                            <phase>process-resources</phase>
                            <goals>
                                <goal>copy-resources</goal>
                            </goals>
                            <configuration>

                                <overwrite>true</overwrite>

                                <outputDirectory>${basedir}/target/classes</outputDirectory>
                                <resources>
                                    <resource>
                                        <!-- source -->
                                        <directory>src/main/resources/dev</directory>
                                    </resource>
                                </resources>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>

如何配置Maven,因为它只将文件夹src / main / resources / dev的内容复制到目标/类?

谢谢你的帮助

4 个答案:

答案 0 :(得分:8)

Maven默认将“src / main / resources”中的所有文件复制到输出文件夹,因此在您当前的配置中,它可能会创建“dev”,“test”和“prod”文件夹及其内容,然后另外复制没有“dev”前缀的开发资源。

我建议保留默认资源文件夹,并仅将其用于与配置文件无关的资源。在您的配置文件中,您可以配置其他资源文件夹:

<profile>
    <id>dev</id>
    <build>
        <resources>
            <resource>
                <directory>${basedir}/src/main/resources-dev</directory>
            </resource>
        </resources>
    </build>
</profile>

还应该可以使用配置文件中定义的属性在公共构建部分中配置它:

<build>
    <resources>
        <resource>
            <directory>${basedir}/src/main/resources-${projectStage}</directory>
        </resource>
    </resources>
</build>
<profiles>
    <profile>
        <id>dev</id>
        <properties>
            <projectStage>dev</projectStage>
        </properties>
    </profile>
</profiles>

如果由于某种原因无法更改当前目录结构,则必须为默认资源文件夹配置排除项,以便不复制嵌套的与配置文件相关的文件夹:

    <build>
        <resources>
            <resource>
                <directory>${basedir}/src/main/resources</directory>
                <excludes>
                    <exclude>dev/**</exclude>
                    <exclude>test/**</exclude>
                    <exclude>prod/**</exclude>
                </excludes>
            </resource>
        </resources>
    </build>

答案 1 :(得分:2)

maven目录结构中的“main”部分就是为此目的而存在的。 您应该在src目录中创建更多dirs,而不是在资源目录中创建目录。 这是默认行为,它已经通过让测试资源在maven生命周期的测试阶段覆盖主要资源来实现。

您的结构应如下所示:

src
  main
    resources
      a.properties
      b.properties
      c.properties
  test
    resources
      b.properties
      c.properties
  dev
    resources
      b.properties

使用此结构,您的“主”目标将具有默认属性文件,测试阶段将临时覆盖b和c,并且开发配置文件将仅覆盖具有另一个自定义版本的b,在最终可部署中。

为了实现这一目标,您必须按照我们在问题中的方式配置maven-resources-plugin,以获取开发配置文件。

当你这样做时,还要考虑:在使用开发配置文件构建时运行单元测试时应该使用哪个版本的属性文件?

答案 2 :(得分:0)

我在maven中使用assembly.xml文件并使用这组代码来确保我的资源文件位于应用程序的根目录...

    <assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">

<id>distribution</id>
<formats>
    <format>tar.gz</format>
</formats>
<fileSets>
    <fileSet>
        <directory>${basedir}</directory>
        <includes>
            <include>bin/**</include>
            <include>webapps/**</include>
            <include>data/**</include>
        </includes>
    </fileSet>
    <fileSet>
        <directory>${basedir}/target</directory>
        <includes>
            <include>*.jar</include>
        </includes>
        <outputDirectory>lib</outputDirectory>
    </fileSet>
    <fileSet>
        <directory>${basedir}/src/main/</directory>
        <includes>
            <include>resources/**</include>
        </includes>
        <outputDirectory>/</outputDirectory>
    </fileSet>
</fileSets>

<dependencySets>
    <dependencySet>
        <outputDirectory>lib</outputDirectory>
        <useProjectArtifact>false</useProjectArtifact>
    </dependencySet>
</dependencySets>

    </assembly>

不知道这是否是最佳方式,但这是我可以想象的。

答案 3 :(得分:0)

除了前面的答案外,您还可以使用maven复制资源将文件从自定义路径复制到特定目录。(尽管不建议这样做,理想情况下是

<configuration>
<!-- Destination target path -->
<outputDirectory>${basedir}/target/classes/com/db/abc/util/</outputDirectory>
<resources>
    <resource>
        <!-- source file path -->
        <directory>C:/Users/abc/Work/filepath</directory>
    </resource>
</resources>
</configuration>