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>
Ответы
Ответ 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 и обновления ресурсов работают как ожидалось.
Надеюсь, что это поможет.
Ответ 4
Я думаю, что это так же, как этот вопрос: IntelliJ Artifact имеет недопустимое расширение
Добавьте расширение .war в выходной каталог, как показано в моем ответе: fooobar.com/info/277389/...