web-dev-qa-db-ja.com

Intellij IDEA artifact 'XXXX:warexplosed' has invalid extension

POM Intellijにごくわずかな変更を加えるたびに、プロジェクト構造の出力ディレクトリ設定でexplodedアーティファクトの.war拡張子が削除されます。これにより、Intellijの実行/デバッグ構成でエラーが発生します。

アーティファクト 'XXXX:warexplosed'に無効な拡張子があります。

この問題を解決するには、プロジェクト構造の出力ディレクトリ設定を手動でオーバーライドする必要があります。 POMに最も小さな変更を加えるたびに、出力ディレクトリ設定に戻り、出力ディレクトリ設定の最後に「.war」を手動で追加する必要があります。これは非常に古くてイライラしています。

例えばこれを変更する必要があります。

E:\ workarea\enterp\application\target\application

これに:

E:\ workarea\enterp\application\target\application.war

次のようにMaven WARプラグインのoutputDirectory構成を手動で設定した場合、これはまったく役に立ちません。

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

2番目の編集:

解決方法の1つは、ビルド構成の$ {project.artifactId}に「.war」を追加することであることがわかりました。例:

<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という名前になることに注意してください。それは動作します-私はIntellijでアーティファクトをWARファイルとしてデプロイしました-しかしそれはいです。

情報[org.jboss.as.server.deployment](MSCサービススレッド1-7)JBAS015876:「XXXX.war.war」(実行時名:「XXXX.war.war)」の展開を開始

誰かが私がWARファイルと展開されたアーティファクトのどちらを展開しているかに応じてMavenと連携して1つまたは他のfinalName値を選択するようにIntellijプロジェクトを構成する方法を教えてくれれば、この質問は十分に答えられます。

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

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

IntelliJでは、pom.xmlファイルを変更せずに、爆発した戦争(または私の場合は爆発した耳)への参照を持つアーティファクトを追加することでこれを修正する方法があり、毎回踏みつけられませんIntelliJはMaven POMを再インポートします。方法は次のとおりです。

  1. 現在のアーティファクトの展開を停止/展開解除します

  2. 実行構成を編集し、[展開]タブで、現在の展開されたwar/earアーティファクトを削除します。

  3. プロジェクトのアーティファクト設定を開き、新しいアーティファクトを追加します Add new artifact

  4. プラスボタンを使用して、新しい戦争または(私の場合は)耳の爆発物を追加します Add new war or ear exploded artifact

  5. 名前を付け、出力ディレクトリを編集して適切な拡張子(.warまたは.ear)を追加します Rename output directory to add extension

  6. [出力レイアウト]セクションで、<output root>、プラスボタンを使用してアーティファクトを追加します Add new artifact in output layout

  7. 目的の分解されたアーティファクトを選択します Select the desired exploded artifact

  8. 実行構成を再度編集し、[展開]タブで、新しい回避策の展開されたアーティファクトを追加します。 Deploy new artifact in run configuration

バグレポート に関するコメントでこれを説明してくれたNikolay Chashnikovに感謝します。

33
Alex Nauda

実際には、finalName属性をそのままにしておく必要があります。そうしないと、説明した問題が発生します。むしろ、次のようにwebappDirectoryを使用するようにmaven warプラグインの設定を変更する必要があります。

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

EAR内のWARについて話している場合、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>

そして、適切なアーティファクトの組み立てのために、プロファイルdefaultおよび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> 

intelliJ内でdebugプロファイルを使用しますIDEA拡張戦争にはdefaultコマンドラインまたはCIでアーティファクトをビルドするためのプロファイル(プロファイルが指定されていない場合、デフォルトのプロファイルがアクティブになるため、ビルドは以前のように機能します)。

Maven Projects view

このソリューションを使用すると、HotSwapとリソースの更新は期待どおりに機能します。

お役に立てれば。

2
Taras