一个Spring Boot项目,可以部署为JAR或WAR文件。

30

有没有一种方法可以使单个Spring Boot项目既能打包成JAR文件又能打包成WAR文件,而不需要更改pom.xml或应用程序源代码?

我已经阅读了将Spring Boot JAR应用程序转换为WAR,但它会将项目转换为WAR文件,并失去了作为JAR文件打包的能力。

我并不希望mvn package同时实现这两种方式。我想要的是类似于mvn i-want-a-jar,它将把项目打包成JAR文件。或者我可以运行mvn i-want-a-war,它将把项目打包成WAR文件。

这种方式是否可行?


不在同一个项目中。 - Stephane Nicoll
我理解这个问题。在意识到可以使用可执行的WAR文件后,我花了一个小时尝试让我的可执行JAR文件正常工作;因为文档中每个人都在说可执行JAR文件,所以我以为我需要一个 :( - John Humphreys
3个回答

43

我通过添加的方式成功地完成了它

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

将配置信息添加到POM文件中,并针对JAR和WAR设置不同的配置文件:

  <profiles>
    <profile>
      <id>jar</id>
      <properties>
        <packaging.type>jar</packaging.type>
      </properties>
    </profile>
    <profile>
      <id>war</id>
      <properties>
        <packaging.type>war</packaging.type>
      </properties>
      <dependencies>
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-tomcat</artifactId>
          <scope>provided</scope>
        </dependency>
      </dependencies>
    </profile>
  </profiles>

现在,mvn package -P war 会生成一个WAR文件,而mvn package -P jar则会生成一个JAR文件。

另一种选择是为JAR和WAR创建单独的模块,但我没有选择这条路。


当您运行mvn package时,默认会发生什么? - Wouter
4
<activation><activeByDefault>true</activeByDefault></activation> 添加到您希望作为默认配置文件运行的配置文件中,这样您就不必设置 -P 标志。 - Daniel Olszewski
另外,似乎在主要的pom.xml文件的<properties>部分中添加packaging.type的默认设置是可以的。 - Conor O'Neill

18

一个可执行的WAR文件有哪些问题?这不是你真正需要的吗?

P.S. 例如
java -jar name.war


1
如何使用 java -jar name.war 执行 Spring Boot WAR 文件?当我尝试使用 Hello World 示例时,出现了 java.lang.NoClassDefFoundError: hello/Application 的错误。 - imgx64
2
没关系,看起来我忘记包含 spring-boot-maven-plugin 了。在我加入它之后,java -jar name.war 就可以工作了。 - imgx64

5
我们最近有一个类似的需求,一个原先被打包成可执行Jar的基于Spring Boot的项目需要支持Tomcat和WildFly部署。
由于该项目使用了一些依赖(例如WebJars),简单地切换为WAR打包不是一个选项,因为这些依赖对于WildFly(VFS支持)是必需的,但在其他部署中则不是。
解决方案是以一种方式重构项目模块,使core模块包含实际项目但没有应用Spring Boot插件,同时多个package模块会依赖core模块并配置部署工件的具体信息(Boot和其他插件、部署特定依赖等)。
这样,项目构建可以在单个构建运行中生成多个部署工件(Boot的可执行Jar、传统的WAR和WildFly特定的WAR)。
如果有人觉得这很有用,演示该方法的示例项目可在Github上获取。该项目可以使用Gradle或Maven进行构建。

这正是我正在寻找的,但我的项目基于Maven。我需要你在基于Maven的结构下帮助我解决这个问题。你能否更新你的Github仓库以适用于基于Maven的项目? - Mubasher
谢谢您的建议。我已经更新了项目,还包括对Maven构建的支持。 - Vedran Pavic
谢谢,顺便说一句:这不是可以通过Maven的配置文件来实现吗? - Mubasher
3
我不太喜欢那种解决方案——如果我正在开发需要支持多个部署环境的产品,我希望所有生成的构件都能在单个构建过程中完成。从持续集成或发布构建的角度来看,拥有一个单一的构建也更加可取。 - Vedran Pavic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接