Подтвердить что ты не робот

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

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

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

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

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

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

:

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

Если я вручную настрою конфигурацию выходного каталога Maven WAR 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}.war</outputDirectory>

    </configuration>
</plugin>

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

EDIT:

Здесь полная конфигурация сборки:

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

SECOND EDIT:

Я обнаружил, что одним из решений является добавление ".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>

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

INFO [org.jboss.as.server.deployment] (поток обслуживания MSC 1-7) JBAS015876: Запуск развертывания "XXXX.war.war" (runtime-name: "XXXX.war.war" )

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

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

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

Ответ 1

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

  • Остановить/развернуть текущее развертывание артефакта

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

  • Откройте настройки артефактов проекта и добавьте новый артефакт Add new artifact

  • Используйте кнопку "плюс", чтобы добавить новую войну или (в моем случае) артефакт взорванного уха Add new war or ear exploded artifact

  • Дайте ему имя, затем отредактируйте каталог вывода, чтобы добавить соответствующее расширение (.war или .ear) Rename output directory to add extension

  • В разделе "Формат вывода", где вы видите <output root>, используйте кнопку "плюс", чтобы добавить артефакт Add new artifact in output layout

  • Выберите желаемый взорванный артефакт Select the desired exploded artifact

  • Еще раз отредактируйте конфигурацию прогона, а на вкладке "Развертывание" добавьте новый обходной артефакт Deploy new artifact in run configuration

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

Ответ 2

Собственно, вы должны оставить атрибут 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>

Ответ 3

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

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

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

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

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

Maven Projects view

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

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