Артефакт Intellij IDEA 'XXXX: война взорвана' имеет недопустимое расширение

Каждый раз, когда я делаю даже самое маленькое изменение в моем POM, Intellij удаляет расширение.war для моего разнесенного артефакта в настройках выходного каталога структуры проекта. Это вызывает ошибку в конфигурации Run/Debug Intellij:

Артефакт "XXXX: война взорвалась" имеет недопустимое расширение.

Чтобы решить эту проблему, я должен вручную переопределить настройку выходного каталога структуры проекта. Каждый раз, когда я делаю даже самое маленькое изменение в POM, я должен возвращаться к настройке выходного каталога и вручную добавлять ".war" в конец настройки выходного каталога. Это становится очень старым и расстраивающим.

например, я должен изменить это:

E: \ Workarea\ Enterp\ приложения \ цель \ приложения

к этому:

E: \ Workarea\ Enterp\ приложения \ цель \application.war

Если я вручную установлю конфигурацию outputDirectory плагина Maven WAR следующим образом, это совсем не поможет:

<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>${maven.war.plugin.version}</version>
    <configuration>

        <!-- Output directory of artifact:war exploded keeps losing the .war extension -->
        <outputDirectory>${project.build.directory}.war</outputDirectory>

    </configuration>
</plugin>

Как я могу решить эту проблему?

РЕДАКТИРОВАТЬ:

Вот полная конфигурация сборки:

    <build>
    <!-- Maven will append the version to the finalName (which is the name
        given to the generated war, and hence the context root) -->
    <finalName>${project.artifactId}</finalName>

    <plugins>
        <!-- Compiler plugin enforces Java 1.6 compatibility and activates annotation
            processors -->
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>${maven.compiler.plugin.version}</version>
            <configuration>
                <source>${maven.compiler.source}</source>
                <target>${maven.compiler.target}</target>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-war-plugin</artifactId>
            <version>${maven.war.plugin.version}</version>
            <configuration>
                <!-- Output directory of artifact:war exploded keeps losing the .war extension -->
                <outputDirectory>${project.build.directory}/${project.artifactId}.war</outputDirectory>

                <!-- Java EE 7 doesn't require web.xml, Maven needs to catch up! -->
                <failOnMissingWebXml>false</failOnMissingWebXml>
            </configuration>
        </plugin>
        <!-- The WildFly plugin deploys your war to a local WildFly container -->
        <!-- To use, run: mvn package wildfly:deploy -->
        <plugin>
            <groupId>org.wildfly.plugins</groupId>
            <artifactId>wildfly-maven-plugin</artifactId>
            <version>${version.wildfly.maven.plugin}</version>
        </plugin>
    </plugins>

</build>

ВТОРОЙ РЕДАКТИРОВАТЬ:

Я обнаружил, что одним из решений является добавление ".war" к ${project.artifactId} в конфигурации сборки, например:

<finalName>${project.artifactId}.war</finalName>

и удалите outputDirectory из конфигурации плагина. Таким образом, конфигурация сборки должна выглядеть так:

<build>
    <!--
        Maven will make finalName the name of the generated war.

        NOTE:   Output directory of artifact:war exploded keeps losing the .war extension
                http://youtrack.jetbrains.com/issue/IDEA-86484
                http://youtrack.jetbrains.com/issue/IDEA-95162

                The solution is to append ".war" to ${project.artifactId}, below:
    -->
    <finalName>${project.artifactId}.war</finalName>

    <plugins>
        <!-- Compiler plugin enforces Java 1.6 compatibility and activates annotation
            processors -->
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>${maven.compiler.plugin.version}</version>
            <configuration>
                <source>${maven.compiler.source}</source>
                <target>${maven.compiler.target}</target>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-war-plugin</artifactId>
            <version>${maven.war.plugin.version}</version>
            <configuration>
                <!-- Java EE 7 doesn't require web.xml, Maven needs to catch up! -->
                <failOnMissingWebXml>false</failOnMissingWebXml>
            </configuration>
        </plugin>
        <!-- The WildFly plugin deploys your war to a local WildFly container -->
        <!-- To use, run: mvn package wildfly:deploy -->
        <plugin>
            <groupId>org.wildfly.plugins</groupId>
            <artifactId>wildfly-maven-plugin</artifactId>
            <version>${version.wildfly.maven.plugin}</version>
        </plugin>
    </plugins>

</build>

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Если вы используете этот обходной путь, просто помните, что при развертывании неразорвавшегося артефакта WAR имя файла будет называться XXXX.war.war. Это работает - я развернул артефакт в виде файла WAR в Intellij - но это ужасно.

ИНФОРМАЦИЯ [org.jboss.as.server.deployment] (служебный поток MSC 1-7) JBAS015876: запуск развертывания "XXXX.war.war" (имя-среды: "XXXX.war.war)"

Если кто-то может сказать мне, как настроить проект Intellij для работы с Maven, чтобы выбрать одно или другое значение finalName в зависимости от того, развертываю ли я файл WAR по сравнению с разнесенным артефактом, тогда на этот вопрос будет дан достаточный ответ.

<!-- Exploded artifact --> 
<finalName>${project.artifactId}.war</finalName>

<!-- WAR file (unexploded) artifact --> 
<finalName>${project.artifactId}</finalName>

4 ответа

Есть способ исправить это в IntelliJ, не изменяя файл (ы) pom.xml, добавив артефакт со ссылкой на взорванную войну (или в моем случае взорванное ухо), и он не будет топтаться каждый раз IntelliJ повторно импортирует Maven POM. Вот как:

  1. Остановить / отменить развертывание вашего текущего артефакта

  2. Отредактируйте конфигурацию запуска и на вкладке "Развертывание" удалите текущий взорванный артефакт войны / уха

  3. Откройте настройки артефактов проекта и добавьте новый артефакт Добавить новый артефакт

  4. Используйте кнопку "плюс", чтобы добавить новый военный или (в моем случае) артефакт, взорванный ухом Добавить новый войной или взорванный ухом артефакт

  5. Дайте ему имя, затем отредактируйте выходной каталог, добавив соответствующее расширение (.war или.ear) Переименуйте выходной каталог, чтобы добавить расширение

  6. В разделе Выходной макет, где вы видите <output root>, используйте кнопку плюс, чтобы добавить артефакт Добавить новый артефакт в макет вывода

  7. Выберите нужный взорванный артефакт Выберите нужный взорванный артефакт

  8. Снова измените конфигурацию запуска и на вкладке "Развертывание" добавьте новый артефакт с разнесенным разрешением. Развертывание нового артефакта в конфигурации запуска

Спасибо Николаю Чашникову за описание в своем комментарии к сообщению об ошибке

На самом деле, вы должны оставить finalName атрибут один, иначе вы получите проблемы, которые вы описываете. Скорее, вы должны изменить конфигурацию для плагина Maven War, чтобы использовать webappDirectory как это:

<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <configuration>
        <webappDirectory>${project.build.directory}/${project.artifactId}.${project.packaging}</webappDirectory>
        <failOnMissingWebXml>false</failOnMissingWebXml>
    </configuration>
</plugin>

Если мы говорим о WAR внутри EAR, есть другой способ решить вашу проблему, используя правильную конфигурацию внутри maven-ear-plugin. WAR pom.xml должен быть оставлен как есть, без каких-либо изменений, но EAR pom.xml должен содержать что-то вроде этого. (пожалуйста, обратите внимание на ${unpack.wars})

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-ear-plugin</artifactId>
    <version>2.9</version>
    <configuration>
        <version>6</version>
        <defaultLibBundleDir>lib</defaultLibBundleDir>
        <generateApplicationXml>false</generateApplicationXml>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
            </manifest>
        </archive>
        <modules>
            <webModule>
                <groupId>com.test.app</groupId>
                <artifactId>test-app-war</artifactId>
                <unpack>${unpack.wars}</unpack>
            </webModule>
        </modules>
    </configuration>
</plugin>

а затем вы можете добавить профили по умолчанию и отлаживать для правильной сборки артефактов.

<profiles>
        <profile>
            <id>default</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <unpack.wars>false</unpack.wars>
            </properties>
        </profile>
        <profile>
            <id>debug</id>
            <activation>
                <property>
                    <name>debug</name>
                </property>
            </activation>
            <properties>
                <unpack.wars>true</unpack.wars>
            </properties>
        </profile>
</profiles> 

используйте профиль отладки внутри IntelliJ IDEA для расширения войн и профиль по умолчанию для создания артефактов в командной строке или CI (профиль по умолчанию будет активен, если профиль не предоставлен, поэтому ваша сборка будет работать как раньше).

Maven Projects просмотр

Благодаря этому решению HotSwap и обновления ресурсов работают как положено.

Надеюсь это поможет.

Я думаю, что это так же, как этот вопрос: IntelliJ Artifact имеет недопустимое расширение

Добавьте расширение.war к выходному каталогу, как показано в моем ответе: /questions/27423449/intellij-artifact-imeet-nedopustimoe-rasshirenie/27423459#27423459

Другие вопросы по тегам