一个 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 默认会发生什么? 将<activation><activeByDefault>true</activeByDefault></activation>
添加到您要作为默认配置运行的配置文件中,因此您不必设置-P
标志。
另外,在主 pom.xml 的 <properties>
部分添加 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-plugin
。 java -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 方式项目