【问题标题】:web.xml is missing and <failOnMissingWebXml> is set to true doesn't work with profilesweb.xml 丢失并且 <failOnMissingWebXml> 设置为 true 不适用于配置文件
【发布时间】:2020-07-10 17:38:26
【问题描述】:

我有一个双重构建、本地(fat jar)和战争(war)的 Spring Boot 应用程序。

我是这样处理的:

<packaging>${application.packaging}</packaging>
...

<profiles>
    <profile>
        <id>dev</id>
        <properties>
            <application.packaging>jar</application.packaging>
        </properties>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    </profile>

    <profile>
        <id>war</id>
        <properties>
            <application.packaging>war</application.packaging>
        </properties>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>3.1.0</version>
                    <configuration>
                        <archive>
                            <manifest>
                                <addDefaultImplementationEntries>false</addDefaultImplementationEntries>
                            </manifest>
                        </archive>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

奇怪的是,即使默认配置文件是dev所以包装是jar,eclipse错误仍然弹出。它似乎对我的构建没有任何影响,但我仍然想摆脱它。 我该怎么做?

【问题讨论】:

  • ${application.packaging} 定义在哪里?
  • 全部申请spring-boot-maven-plugin,只需更换包装即可。
  • @JFMeier 正如你所看到的,它是在配置文件中定义的一个属性,它是用于开发的 jar 和用于战争的战争
  • 将包装定义为war 删除配置文件和maven-war-plugin ...正如这里的几个人已经提到的那样。
  • @Phate 不,我看不到您在哪里设置 ${application.packaging} 的值。它在命令行上吗?还是在&lt;properties&gt; 部分?

标签: eclipse spring-boot maven


【解决方案1】:

从您的个人资料中删除插件。只更换包装。

<packaging>${application.packaging}</packaging>

<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
  </plugins>
</build>  

<profiles>
    <profile>
        <id>dev</id>
        <properties>
            <application.packaging>jar</application.packaging>
        </properties>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>

    <profile>
        <id>war</id>
        <properties>
            <application.packaging>war</application.packaging>
        </properties>       
    </profile>
</profiles>

这就是你所需要的。不多也不少。 Spring Boot 使用的 war 插件已经是较新的插件,不再需要 web.xml

虽然我强烈建议不要使用它并使用 war 作为 dev 的包装。你可以像jar 一样完美地执行war。所以只需构建一个war

<packaging>war</packaging>

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</provided>
  </dependency>
</dependencies>

<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
  </plugins>
</build>  

这将构建一个既可执行又可部署的 war 文件。这一切都在Spring Boot Documentation 中进行了解释。它有一整节关于如何做到这一点。

【讨论】:

  • 这正是我想要避免的,也是本主题的目的……我为什么要为我的本地环境保留一个战争构建插件?
  • Read... 删除那个插件,只留下spring boot插件。
  • 但是这样只能打败一个遥远的罐子......或者不是?
  • 不,不会的。如前所述,我强烈建议不要构建 2 个不同的工件。只需在您的常规开发中构建战争。你仍然可以执行它java -jar my.war。它既可执行又可部署。
猜你喜欢
  • 2023-03-21
  • 2018-11-21
  • 2016-01-22
  • 1970-01-01
  • 2015-05-31
  • 1970-01-01
  • 2018-09-16
  • 1970-01-01
  • 2013-04-14
相关资源
最近更新 更多