当前位置: 首页 > 知识库问答 >
问题:

Intellij IDEA工件“XXXX:战争爆发”的扩展名无效

勾海超
2023-03-14

每次我对POM进行哪怕是最微小的更改,Intellij都会删除。项目结构输出目录设置中我的分解工件的war扩展。这会导致Intellij的运行/调试配置出错:

工件“XXXX:战争爆发”的扩展名无效。

为了解决这个问题,我必须手动覆盖项目结构输出目录设置。每次我对POM进行哪怕是最微小的更改,我都必须返回到输出目录设置,并手动将“.war”附加到输出目录设置的末尾。这已经变得非常陈旧和令人沮丧了。

e、 g.我必须改变这一点:

E:\workarea\entrep\application\target\application

为此:

E:\workarea\entrep\application\target\application。战争

如果我按如下方式手动设置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>

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

信息[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>

共有3个答案

广瑞
2023-03-14

如果我们讨论的是EAR内部的战争,那么有另一种方法可以通过使用maven EAR插件内部的正确配置来解决您的问题。战争pom。xml应该保持原样,不做任何更改,但是EAR pom。xml应该包含这样的内容。(请注意

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

使用此解决方案,热插拔和资源更新工作正常。

希望这能有所帮助。

长孙燕七
2023-03-14

实际上,你应该把finalName属性放在一边,否则你会遇到你描述的问题。相反,您应该更改maven war插件的配置,以使用webappDirectory,如下所示:

<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <configuration>
        <webappDirectory>${project.build.directory}/${project.artifactId}.${project.packaging}</webappDirectory>
        <failOnMissingWebXml>false</failOnMissingWebXml>
    </configuration>
</plugin>
潘文乐
2023-03-14

有一种方法可以在IntelliJ中解决这个问题,而无需更改pom。xml文件,通过添加一个引用分解的war(或者在我的例子中,分解的ear)的工件,它不会每次IntelliJ重新导入maven pom时都被踩到。以下是方法:

>

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

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

    感谢尼古拉·查什尼科夫(Nikolay Chashnikov)在对bug报告的评论中描述了这一点

  •  类似资料:
    • 我一直在努力研究如何使用maven overlay插件将项目排除在爆炸战争之外。 我有以下内容: xml和applicationcontext.xml可以很好地排除,但它们位于:${basedir}/src/main/webapp/web-inf/下 无论我尝试什么,这些文件是静止的,覆盖,尽管排除。

    • 我们在IntelliJ(Ultimate 14.1.14)中有一个java web项目,我们希望从爆炸战争中排除某个文件夹。

    • 我跟随以下帖子,但这些都没有帮助我。邮政一、邮政二、邮政03、邮政04 我花了两天时间寻找答案,请帮帮我。

    • 无法创建目录[/tmp/tomcat.9153500015669016883.8080/webapps/blog] 这是tomcat工作目录的布局: 中的断点表示它希望在webapps/中创建目录。此不存在的webapps文件夹取自(来自)。

    • 我尝试使用Spring Boot 2.0.2从战争转移到罐子,并且在使用故障安全进行maven测试时遇到了问题。 我看到两种错误: > < li> < code > Java . lang . noclassdeffounderror ,其中列出了我的一个bean类 当我在 IntelliJ 中运行这些测试时,一切正常,但它们在 maven 中失败。与此同时,当我回到建立战争而不是罐子时,一切都有

    • Electron supports Chrome DevTools extensions, which can be used to extend the ability of Chrome's developer tools for debugging popular web frameworks. 使用工具加载 DevTools 扩展 加载 DevTools 扩展的最简单方法是使用第三方工具,