一个 Spring Boot 项目,部署到 JAR 或 WAR

Posted

技术标签:

【中文标题】一个 Spring Boot 项目,部署到 JAR 或 WAR【英文标题】:One Spring Boot project, deploy to both JAR or WAR 【发布时间】:2014-07-15 03:16:06 【问题描述】:

有没有办法在不更改 pom.xml 或应用程序源的情况下将单个 Spring Boot 项目打包到 JAR 和 WAR 中?

我已阅读 Converting a Spring Boot JAR Application to a WAR,但它项目转换为 WAR,并且无法打包为 JAR。

我不希望mvn package 两者兼得。我想要的是 mvn i-want-a-jar 之类的东西,它将项目打包为 JAR。或者我可以运行mvn i-want-a-war,它会将项目打包为WAR。

这可能吗?

【问题讨论】:

不在同一个项目号 我很同情这个问题。我花了一个小时试图让我的可执行 jar 工作,然后才意识到我可以很好地使用可执行 WAR;每个人都在文档中说可执行 JAR,所以我认为我需要一个 :( 【参考方案1】:

我设法通过添加来做到这一点

<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 默认会发生什么? &lt;activation&gt;&lt;activeByDefault&gt;true&lt;/activeByDefault&gt;&lt;/activation&gt; 添加到您要作为默认配置运行的配置文件中,因此您不必设置-P 标志。 另外,在主 pom.xml 的 &lt;properties&gt; 部分添加 packaging.type 的默认设置似乎没问题。【参考方案2】:

可执行的 WAR 文件有什么问题?这不是你真正需要的吗?

附:喜欢java -jar name.war

【讨论】:

如何使用java -jar name.war 执行 Spring Boot WAR 文件?当我尝试使用 Hello World 示例时,我得到 java.lang.NoClassDefFoundError: hello/Application 没关系,看来我忘了包括spring-boot-maven-pluginjava -jar name.war 在我包含它之后工作。【参考方案3】:

我们最近有一个类似的需求,其中一个基于 Spring Boot 的现有项目最初打包为可执行 Jar,需要支持 Tomcat 和 WildFly 部署。

由于此项目中使用了一些依赖项(例如 WebJars),因此无法选择简单地切换到 WAR 包,因为 WildFly(VFS 支持)需要其中一些依赖项,但其他部署不需要。

解决方案是以 core 模块包含实际项目但没有应用 Spring Boot 插件的方式重组项目模块,而几个 package 模块将依赖于core 模块并配置部署工件细节(引导和其他插件、部署特定依赖项等)。

这样,项目构建能够在单个构建运行中生成多个部署工件(Boot 的可执行 JAR、传统 WAR 和 WildFly 特定 WAR)。

如果有人觉得这很有用,演示该方法的示例项目是available on Github。该项目可以由 Gradle 或 Maven 构建。

【讨论】:

这是我正在寻找的,但我的项目是基于 maven 的。在基于 Maven 的结构中,我需要你的帮助。您能否为基于 Maven 的项目更新您的 Github 存储库。 感谢您的建议。我已经更新了项目,使其还包括对 Maven 构建的支持。 谢谢,顺便说一句:这不是可以通过maven的配置文件来实现的吗? 我不喜欢该解决方案 - 如果我正在构建一个需要支持多个部署环境的产品,我希望所有工件都由一次构建运行生成。从 CI 或发布构建的角度来看,最好使用单个构建。

以上是关于一个 Spring Boot 项目,部署到 JAR 或 WAR的主要内容,如果未能解决你的问题,请参考以下文章

nginx 部署多个 spring-boot jar 方式项目

spring-boot项目打包的jar包怎么部署到linux上,并运行啊!

Spring Boot 项目部署到 Linux服务器

Spring Boot 部署浅析(jar or war)

linux部署spring-boot

Tomcat使用Tomcat部署Spring Boot项目生成的jar包