Почему maven-war-plugin не упаковывает мои файлы?

Не знаю почему, но maven-war-plugin перестал перемещать мои файлы в WEB-INF/config. Вот как я использую плагин:

<profiles>
    <profile>       
        <id>default-profile</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>   
        <build>
            <pluginManagement> 
                <plugins>   
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-war-plugin</artifactId>
                        <version>2.6</version>
                        <configuration>
                            <webResources>
                                <resource>
                                    <directory>${basedir}/src/main/assembly/${package-mode}/config</directory>
                                    <filtering>true</filtering>
                                    <targetPath>WEB-INF/config</targetPath>
                                </resource>
                            </webResources>
                        </configuration>
                    </plugin>  
                </plugins>
            </pluginManagement>
        </build>    
    </profile>
</profiles>

Вопрос: что я мог сделать, чтобы снова сломать это? Наконец-то это сработало, теперь уже нет.

Вот как я запускаю свой сервер:

mvn tomcat7:run-war -Denv=dev -Dpackage-mode=dev -DskipTests

Файл WAR собирается и запаковывается, но этих файлов из src/main/assembly/dev/config просто нет.


person Stefan Falk    schedule 04.06.2016    source источник
comment
не по теме: пожалуйста, никогда не используйте профили для создания артефактов, специфичных для среды. Идея состоит в том, чтобы всегда иметь один и тот же артефакт независимо от аргументов. Для ваших целей рассмотрите возможность использования github.com/khmarbaise/multienv-maven-plugin для чистый раствор.   -  person Robert Scholte    schedule 04.06.2016
comment
@displayname Я вижу, что вы определяете maven-antrun-plugin в своем pom с комментарием, которому я не могу поверить? Для чего нужен maven-antrun-plugin?   -  person khmarbaise    schedule 04.06.2016
comment
@khmarbaise О, это на самом деле не связано с этим конкретным вопросом здесь, но мне пришлось добавить его по другой причине. До сих пор я изменил свой pom.xml и использую maven-war-plugin вместо maven-antrun-plugin. Однако странным образом этот комментарий оказался правдой.   -  person Stefan Falk    schedule 04.06.2016
comment
Основываясь на другом вопросе, вы пытаетесь нарушить соглашение о парадигме конфигурации, что приводит к таким проблемам, которые у вас есть. Делать такие вещи через antrun просто неправильно...   -  person khmarbaise    schedule 04.06.2016
comment
@khmarbaise Я не использовал Maven больше, чем для управления зависимостями - все, что выходит за рамки этого, к сожалению, на данный момент мне не по плечу. Использование antrun показалось мне разумным, но после того, как А. Ди Маттео предложил maven-war-plugin, я понял, что это определенно лучший выбор. Говоря о том, какой плагин использовать, что, если мне нужно вводить ресурсы из jar (зависимости) в мою WAR - какие-либо предложения по плагину здесь? ^^   -  person Stefan Falk    schedule 04.06.2016
comment
Если у вас есть ресурсы в банке, где эта банка упакована в WAR, это означает, что она находится в пути к классам WAR, поэтому нет необходимости распаковывать ресурсы? Может быть, эти ресурсы больше относятся к войне, чем в файле jar?   -  person khmarbaise    schedule 04.06.2016
comment
@khmarbaise Ну, этот jar-файл — моя модель данных. Предполагается, что эта модель данных будет использоваться различными модулями, которые могут реализовывать собственный уровень репозитория. Кроме того, я использую FlywayDB, которая ищет db/migrate в пути к классам, чтобы запускать новые сценарии .sql. Выполняется любой невидимый скрипт, и новая база данных версионируется, но для этого веб-сервер должен видеть те, что находятся в db/migrate.   -  person Stefan Falk    schedule 04.06.2016
comment
Что вы подразумеваете под моделью данных, которую использует WAR? Классы, которые вы создали для этого?   -  person khmarbaise    schedule 04.06.2016
comment
@khmarbaise да. Это сгенерированные Java POJO для доступа к базе данных. Они привыкают к моему репозиторию.   -  person Stefan Falk    schedule 05.06.2016
comment
Это означает, что это отдельный модуль, который содержит только Java POJO. Так зачем вам ресурсы?   -  person khmarbaise    schedule 05.06.2016
comment
@khmarbaise Основной модуль сервера использует FlywayDB. FlywayDB проверяет состояние базы данных и, по сути, просто смотрит, есть ли новый файл .sql в пути к классам db/migration, и если да, то выполняет этот скрипт. Это означает, что основной модуль должен иметь этот файл в своем пути к классам (я не знаю, можно ли это сделать проще). Для этого я в настоящее время распаковываю data-model.jar и копирую эти файлы в каталог resources/ основного модуля сервера, который затем перемещает эти файлы в WAR. Я знаю, что это нехорошо, но я не знаю, как сделать лучше   -  person Stefan Falk    schedule 05.06.2016
comment
Как я уже поставил. Упаковка jar в WAR означает, что jar находится в пути к классам. Так что распаковывать не надо.   -  person khmarbaise    schedule 05.06.2016


Ответы (1)


Запуск минимального pom ниже в соответствии с вашим вопросом:

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.sample</groupId>
    <artifactId>web-sample</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>

    <profiles>
        <profile>
            <id>default-profile</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <build>
                <pluginManagement>
                    <plugins>
                        <plugin>
                            <groupId>org.apache.maven.plugins</groupId>
                            <artifactId>maven-war-plugin</artifactId>
                            <version>2.6</version>
                            <configuration>
                                <webResources>
                                    <resource>
                                        <directory>${basedir}/src/main/assembly/${package-mode}/config</directory>
                                        <filtering>true</filtering>
                                        <targetPath>WEB-INF/config</targetPath>
                                    </resource>
                                </webResources>
                            </configuration>
                        </plugin>
                        <plugin>
                            <groupId>org.apache.tomcat.maven</groupId>
                            <artifactId>tomcat7-maven-plugin</artifactId>
                            <version>2.0</version>
                        </plugin>
                    </plugins>
                </pluginManagement>
            </build>
        </profile>
    </profiles>
</project>

И выполнение Maven, как показано ниже:

mvn tomcat7:run-war -Dpackage-mode=dev

Файлы были скопированы правильно, что также указано в журнале сборки:

[INFO] --- maven-war-plugin:2.6:war (default-war) @ web-sample ---   
[INFO] Packaging webapp   
[INFO] Assembling webapp [web-sample] in [C:\Development\workspace-mars\web-sample\target\web-sample]   
[INFO] Processing war project   
[INFO] Copying webapp webResources [C:\Development\workspace-mars\web-sample/src/main/assembly/dev/config] to [C:\Development\workspace-mars\web-sample\target\web-sample]   
[INFO] Copying webapp resources [C:\Development\workspace-mars\web-sample\src\main\webapp]   
[INFO] Webapp assembled in [106 msecs]   
[INFO] Building war: C:\Development\workspace-mars\web-sample\target\web-sample.war   
[INFO]     
[INFO] <<< tomcat7-maven-plugin:2.0:run-war (default-cli) < package @ web-sample <<<   

Следовательно, ошибка находится где-то еще в вашем проекте или в вашей конфигурации POM.

Я бы предложил запустить

mvn clean

И повторите попытку. Кроме того, для запуска

mvn clean package

И проверьте, копируются ли файлы или нет, независимо от выполнения плагина tomcat7.

person A_Di-Matteo    schedule 04.06.2016
comment
Я действительно не понимаю, почему это работало вчера, когда у меня было это в <profile> ... - person Stefan Falk; 04.06.2016
comment
Согласно вашему pom, вы определяете его в профиле, активированном по умолчанию, И в pluginManagement, почему? - person A_Di-Matteo; 04.06.2016
comment
Хорошо, теперь я вижу, что ты добавил это в профиль. Я уже переместил его в сборку/плагины, и он работает — думаю, так и оставлю :) - person Stefan Falk; 04.06.2016
comment
Есть ли шанс, что вы знаете, как я могу скопировать ресурсы из jar-зависимости в окончательную WAR? ^^ - person Stefan Falk; 04.06.2016
comment
проверьте это сообщение SO, в основном вы можете распаковать зависимость в целевой папке, а затем скопировать ресурсы оттуда - person A_Di-Matteo; 04.06.2016