web-dev-qa-db-fra.com

Intellij IDEA l'artefact 'XXXX: la guerre a explosé' a une extension invalide

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>
21
Patrick Garner

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:

  1. Arrêtez/annulez le déploiement de votre artefact actuel

  2. Modifiez votre configuration d'exécution et, dans l'onglet Déploiement, supprimez l'artefact de guerre/oreille explosé actuel

  3. Ouvrez les paramètres des artefacts du projet et ajoutez un nouvel artefact Add new artifact

  4. Utilisez le bouton plus pour ajouter une nouvelle guerre ou (dans mon cas) un artefact explosé à l'oreille Add new war or ear exploded artifact

  5. Donnez-lui un nom, puis modifiez le répertoire de sortie pour ajouter l'extension appropriée (.war ou .ear) Rename output directory to add extension

  6. Dans la section Disposition de sortie où vous voyez <output root>, utilisez le bouton plus pour ajouter un artefact Add new artifact in output layout

  7. Sélectionnez l'artefact explosé souhaité Select the desired exploded artifact

  8. Modifiez à nouveau votre configuration d'exécution et, dans l'onglet Déploiement, ajoutez le nouvel artefact éclaté de solution de contournement. Deploy new artifact in run configuration

Merci à Nikolay Chashnikov d'avoir décrit cela dans son commentaire sur le rapport de bogue

33
Alex Nauda

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>
4
Engineer Dollery

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

Maven Projects view

Avec cette solution, HotSwap et les mises à jour des ressources fonctionnent comme prévu.

J'espère que cela t'aides.

2
Taras