Chaque fois que j'apporte la moindre modification à mon POM Intellij supprime l'extension .war pour mon éclaté artefact dans le paramètre de répertoire de sortie de la structure du projet. Cela provoque une erreur dans la configuration Run/Debug d'Intellij:
L'artefact 'XXXX: la guerre a explosé' a une extension invalide.
Afin de résoudre le problème, je dois remplacer manuellement le paramètre du répertoire de sortie de la structure du projet. Chaque fois que j'apporte la moindre modification au POM, je dois revenir au paramètre du répertoire de sortie et ajouter manuellement ".war" à la fin du paramètre du répertoire de sortie. Cela devient très vieux et frustrant.
par exemple. Je dois changer cela:
E:\workarea\enterp\application\target\application
pour ça:
E:\workarea\enterp\application\target\application.war
Si je définis manuellement la configuration de sortieDirectory du plug-in Maven WAR comme suit, cela n'aide pas du tout:
<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>
Comment puis-je résoudre ce problème?
MODIFIER:
Voici la configuration complète de la construction:
<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>
DEUXIÈME MODIFICATION:
J'ai découvert qu'une solution consiste à ajouter ".war" à $ {project.artifactId} dans la configuration de construction, par exemple:
<finalName>${project.artifactId}.war</finalName>
et supprimez outputDirectory de la configuration du plugin. La configuration de construction devrait donc ressembler à ceci:
<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>
AVERTISSEMENT: si vous utilisez cette solution de contournement, sachez simplement que lorsque vous déployez un artefact WAR non explosé, le nom du fichier sera nommé XXXX.war.war. Cela fonctionne - j'ai déployé l'artefact en tant que fichier WAR dans Intellij - mais c'est moche.
INFO [org.jboss.as.server.deployment] (thread de service MSC 1-7) JBAS015876: Démarrage du déploiement de "XXXX.war.war" (runtime-name: "XXXX.war.war)"
Si quelqu'un peut me dire comment configurer le projet Intellij pour qu'il fonctionne avec Maven afin de sélectionner l'une ou l'autre des valeurs finalName selon que je déploie un fichier WAR par rapport à un artefact éclaté, cette question recevra une réponse suffisante.
<!-- Exploded artifact -->
<finalName>${project.artifactId}.war</finalName>
<!-- WAR file (unexploded) artifact -->
<finalName>${project.artifactId}</finalName>
Il existe un moyen de résoudre ce problème dans IntelliJ, sans modifier vos fichiers pom.xml, en ajoutant un artefact avec une référence à la guerre éclatée (ou dans mon cas, l'oreille éclatée) et il ne sera pas piétiné à chaque fois IntelliJ réimporte le (s) pom maven. Voici comment:
Arrêtez/annulez le déploiement de votre artefact actuel
Modifiez votre configuration d'exécution et, dans l'onglet Déploiement, supprimez l'artefact de guerre/oreille explosé actuel
Ouvrez les paramètres des artefacts du projet et ajoutez un nouvel artefact
Utilisez le bouton plus pour ajouter une nouvelle guerre ou (dans mon cas) un artefact explosé à l'oreille
Donnez-lui un nom, puis modifiez le répertoire de sortie pour ajouter l'extension appropriée (.war ou .ear)
Dans la section Disposition de sortie où vous voyez <output root>
, utilisez le bouton plus pour ajouter un artefact
Sélectionnez l'artefact explosé souhaité
Modifiez à nouveau votre configuration d'exécution et, dans l'onglet Déploiement, ajoutez le nouvel artefact éclaté de solution de contournement.
Merci à Nikolay Chashnikov d'avoir décrit cela dans son commentaire sur le rapport de bogue
En fait, vous devriez laisser l'attribut finalName
tranquille, sinon vous obtiendrez les problèmes que vous décrivez. Vous devriez plutôt changer la configuration du plugin maven war pour utiliser le webappDirectory
comme ceci:
<plugin>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webappDirectory>${project.build.directory}/${project.artifactId}.${project.packaging}</webappDirectory>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
Si nous parlons de WAR dans EAR, il existe un autre moyen de résoudre votre problème en utilisant une configuration correcte dans maven-ear-plugin. WAR pom.xml devrait être laissé tel quel, sans aucune modification, mais EAR pom.xml devrait contenir quelque chose comme ça. (veuillez prêter attention à <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>
puis vous pouvez ajouter des profils par défaut et déboguer pour un assemblage correct des artefacts.
<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>
utiliser le profil de débogage dans IntelliJ IDEA pour l'expansion des guerres et par défaut profil pour construire des artefacts en ligne de commande ou CI (le profil par défaut serait actif si aucun profil n'était fourni, donc votre build fonctionnera comme précédemment).
Avec cette solution, HotSwap et les mises à jour des ressources fonctionnent comme prévu.
J'espère que cela t'aides.