Ресурсы Maven не копируют файлы - PullRequest
7 голосов
/ 04 января 2012

Я хочу использовать maven для замены некоторых моих файлов * .properties в моем файле war.

Поэтому я создал папки 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 в target / classes?

Спасибо за помощь

Ответы [ 3 ]

8 голосов
/ 04 января 2012

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>
2 голосов
/ 04 июня 2014

Для этой цели существует «основная» часть в структуре каталогов maven. Вместо того чтобы создавать каталоги внутри директории ресурсов, вы должны создать больше директорий в вашей директории src. Это поведение по умолчанию, и оно уже реализовано, позволяя ресурсам тестирования переопределять основные ресурсы на этапах тестирования жизненного цикла maven.

Ваша структура должна выглядеть так:

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

С этой структурой ваша «главная» цель будет иметь файлы свойств по умолчанию, фазы тестирования будут временно перезаписывать b и c, а профиль dev будет перезаписывать только b еще одной пользовательской версией в окончательном варианте. *

Чтобы достичь этого, вам нужно настроить maven-resources-plugin, как вы это уже делали в нашем вопросе, для профиля разработчика.

И когда вы это сделаете, также подумайте: какую версию файлов свойств следует использовать при запуске модульных тестов при сборке с использованием профиля dev?

0 голосов
/ 08 июня 2015

Я использовал файл assembly.xml в maven и использовал этот набор кода, чтобы убедиться, что мой файл ресурсов находится в корневом каталоге приложения ...

    <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>

Не знаюесли это лучший способ, но я мог бы его визуализировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...