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>

第二次编辑:

我发现一种解决方案是在构建配置中将“.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>

免责声明:如果您使用此解决方法,请注意,当您部署未爆炸的 WAR 工件时,文件名将命名为 XXXX.war.war。它可以工作——我在 Intellij 中将工件部署为 WAR 文件——但它很难看。

INFO [org.jboss.as.server.deployment](MSC 服务线程 1-7)JBAS015876:开始部署“XXXX.war.war”(运行时名称:“XXXX.war.war)”

如果有人可以告诉我如何配置 Intellij 项目以使用 Maven 来选择一个或另一个 finalName 值,具体取决于我是部署 WAR 文件还是展开的工件,那么这个问题将得到充分回答。

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

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

4 回答 4

36

有一种方法可以在 IntelliJ 中解决此问题,无需更改您的 pom.xml 文件,方法是添加一个参考爆炸战争(或者在我的情况下,爆炸耳朵)的工件,并且它不会每次都被踩到IntelliJ 重新导入 maven pom(s)。就是这样:

  1. 停止/取消部署您当前的工件部署

  2. 编辑您的运行配置,并在部署选项卡中,删除当前爆炸的战争/耳朵工件

  3. 打开项目的 Artifacts 设置并添加一个新的 artifact 添加新工件

  4. 使用加号按钮添加新的战争或(在我的情况下)耳爆神器 添加新的战争或耳爆神器

  5. 为其命名,然后编辑输出目录以添加适当的扩展名(.war 或 .ear) 重命名输出目录以添加扩展名

  6. 在您看到的输出布局部分中<output root>,使用加号按钮添加工件 在输出布局中添加新工件

  7. 选择所需的分解工件 选择所需的分解工件

  8. 再次编辑您的运行配置,并在部署选项卡中,添加新的解决方法爆炸工件 在运行配置中部署新工件

感谢 Nikolay Chashnikov 在他对错误报告的评论中描述了这一点

于 2014-12-23T00:28:01.247 回答
4

实际上,您应该finalName单独保留该属性,否则您会遇到您描述的问题。相反,您应该更改 Maven 战争插件的配置以使用webappDirectory如下:

<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 回答
3

如果我们在 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>

然后您可以添加配置文件默认值调试以进行正确的工件组装。

<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 IDEA 中的调试配置文件来扩展战争和在命令行或 CI 中构建工件的默认配置文件(如果没有提供配置文件,默认配置文件将处于活动状态,因此您的构建将像以前一样工作)。

Maven 项目视图

使用此解决方案,HotSwap 和资源更新按预期工作。

希望这可以帮助。

于 2015-10-06T09:21:39.353 回答
-1

我认为这与这个问题相同:IntelliJ Artifact has invalid extension

如我的回答所示,将 .war 扩展名添加到输出目录:https ://stackoverflow.com/a/25569266/968988

于 2014-08-29T13:28:37.280 回答