23

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

アーティファクト 'XXXX:爆発した戦争' の拡張子が無効です。

この問題を解決するには、プロジェクト構造の出力ディレクトリ設定を手動でオーバーライドする必要があります。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ファイルとしてデプロイしました-しかし、それは醜いです。

INFO [org.jboss.as.server.deployment] (MSC サービススレッド 1-7) JBAS015876: "XXXX.war.war" (ランタイム名: "XXXX.war.war)" のデプロイメントを開始しています

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

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

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

4 に答える 4

4

実際には、属性をそのままにしておく必要があり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>
于 2014-07-15T19:38:00.487 に答える