SpringBoot(三)之打包方式

简介: 在 mainClass 元素中指定主类的完全限定名,这是可执行 JAR 文件的入口点。

SpringBoot(三)之打包方式

Spring Boot 提供了几种常见的打包方式,具体取决于你的项目需求和偏好:


JAR(可执行的JAR文件): 这是 Spring Boot 的默认打包方式。它将项目的所有依赖打包到一个可执行的 JAR 文件中,包括 Spring Boot 应用程序以及嵌入的 Tomcat 或 Jetty 等服务器。你可以通过运行 java -jar your-application.jar 来启动应用程序。

WAR(Web应用程序存档): 如果你需要将 Spring Boot 应用程序部署到外部的 Servlet 容器(如 Tomcat、Jetty 或者 Wildfly),你可以打包为 WAR 文件。在这种情况下,Spring Boot 应用程序不会包含嵌入式的服务器,而是依赖于外部容器来运行。

Executable WAR(可执行的WAR文件): 从 Spring Boot 1.4 版本开始,你可以创建一个可执行的 WAR 文件。这种方式结合了 JAR 和 WAR 的优点。它允许你在外部容器中部署 Spring Boot 应用程序,并且仍然可以像运行 JAR 文件一样启动它。你只需要将 WAR 文件部署到 Servlet 容器中即可。

Executable JAR with Dependencies(带依赖的可执行JAR文件): 有时你可能希望生成一个包含所有依赖的可执行 JAR 文件,而不是将依赖打包到 JAR 文件中。你可以使用 Maven 或 Gradle 插件来实现这一点,例如 Spring Boot Maven 插件或 Spring Boot Gradle 插件。这种方式生成的 JAR 文件会比较大,但可以更容易地与其他项目共享依赖。

以上是一些常见的 Spring Boot 打包方式,你可以根据项目需求选择适合你的方式。


一、jar包形式


在 Maven 项目的 pom.xml 文件中,确保你有 spring-boot-starter-parent 作为父项目,并且添加了 spring-boot-maven-plugin 插件。


<project>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.2</version>
    </parent>
    <dependencies>
        <!-- 你的其他依赖 -->
    </dependencies>

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

2.执行mvn clean package,这将在项目的 target 文件夹下生成一个可执行的 JAR 文件。

tips:可跳过tests执行 mvn clean package -DskipTests


3.cd target 目录下,执行java -jar 生成的jar包命令运行web项目


 java -jar .\spring-boot-start-0.0.1-SNAPSHOT.jar

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.6.4)

2024-05-15 11:00:26.009  INFO 19712 --- [           main] c.a.s.SpringBootStartApplication         : Starting SpringBootStartApplication v0.0.1-SNAPSHOT using Java 1.8.0_261 on DESKTOP-SQBHU59 with PID 19712 (D:\practise\spring-all\spring-boot-start\target\spring-boot-start-0.0.1-SNAPSHOT.jar started by aoxiaojun in D:\practise\spring-all\spring-boot-start\target)
2024-05-15 11:00:26.011  INFO 19712 --- [           main] c.a.s.SpringBootStartApplication         : No active profile set, falling back to 1 default profile: "default"
2024-05-15 11:00:27.095  INFO 19712 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 1010 (http)
2024-05-15 11:00:27.106  INFO 19712 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2024-05-15 11:00:27.106  INFO 19712 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.58]
2024-05-15 11:00:27.156  INFO 19712 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2024-05-15 11:00:27.157  INFO 19712 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1105 ms
2024-05-15 11:00:27.198  INFO 19712 --- [           main] f.a.AutowiredAnnotationBeanPostProcessor : Autowired annotation should only be used on methods with parameters: public java.lang.String cn.axj.springbootstart.controller.TestController.test()
2024-05-15 11:00:27.447  INFO 19712 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 1010 (http) with context path ''
2024-05-15 11:00:27.453  INFO 19712 --- [           main] c.a.s.SpringBootStartApplication         : Started SpringBootStartApplication in 1.761 seconds (JVM running for 2.13)

二、war包


对于那种项目需要经常更新某个文件的情况,可以将springboot项目打包成war包,便于更新某些文件,而不用打整包的形式上线。打成war后需要依赖外部的serlvet容器运行,如tomcat,jetty等。


修改启动类: 需要修改 Spring Boot 应用程序的启动类,以扩展 SpringBootServletInitializer 类,并覆盖 configure 方法。这个类负责初始化 Servlet 容器,并加载 Spring 应用程序上下文。



import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

public class ServletInitializer extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(YourSpringBootApplication.class);
    }

}
  1. 修改maven配置
<packaging>war</packaging>
<dependencies>
    <!-- 排除内嵌的容器依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
</dependencies>

执行mvn clean package


部署 WAR 文件: 构建成功后,WAR 文件会生成在目标文件夹下(通常是 target 目录),你可以将生成的 WAR 文件部署到外部的 Servlet 容器中。


三、Executable WAR


可执行的war包,可以通过java -jar命令直接运行,也可以在外部容器中部署和运行


在 Maven 项目的 pom.xml 文件中,确保你有 spring-boot-starter-parent 作为父项目,并且添加了 spring-boot-maven-plugin 插件。同时,将 <executable> 设置为 true。



<packaging>war</packaging>
<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <executable>true</executable>
                </configuration>
            </plugin>
        </plugins>
</build>
  1. 执行 mvn clean package
  2. 在可以通过java -jar 命令执行war文件。
 java -jar .\target\spring-boot-start-0.0.1-SNAPSHOT.war

四、Executable JAR with Dependencies(基本不用)


Spring Boot 的可执行 JAR 文件和带依赖的可执行 JAR 文件之间有一些区别:


可执行 JAR 文件: Spring Boot 的可执行 JAR 文件是指将应用程序本身和其依赖的库(例如 Spring Boot 框架、第三方库等)打包到一个独立的 JAR 文件中。这个 JAR 文件包含了所有需要的类文件和资源文件,以及一个 MANIFEST.MF 文件,指定了应用程序的入口点。你可以通过运行 java -jar your-application.jar 来启动应用程序。

带依赖的可执行 JAR 文件: 带依赖的可执行 JAR 文件是指将应用程序本身以及其依赖的所有库打包到一个 JAR 文件中。不同之处在于,带依赖的 JAR 文件会将所有依赖的库直接包含在 JAR 文件中,而不是像普通的可执行 JAR 文件那样仅包含应用程序本身的类和资源。这意味着生成的 JAR 文件会更大,因为它包含了所有依赖的库。这种方式使得 JAR 文件更加独立,可以更容易地与其他项目共享,并且无需依赖外部的库。

总的来说,带依赖的可执行 JAR 文件包含了应用程序本身和所有依赖的库,而普通的可执行 JAR 文件只包含了应用程序本身。选择哪种方式取决于你的项目需求和偏好,如果你希望生成一个独立的、包含所有依赖的 JAR 文件,可以选择带依赖的可执行 JAR 文件;如果你希望生成一个轻量级的 JAR 文件,并且不包含依赖的库,可以选择普通的可执行 JAR 文件。


要配置生成带有依赖的可执行 JAR 文件,你可以使用 Maven Assembly 插件或 Maven Shade 插件。以下是详细的配置步骤:


使用 Maven Assembly 插件:


在 Maven 项目的 pom.xml 文件中,添加 Maven Assembly 插件,并配置以生成带有依赖的可执行 JAR 文件。



<build>
    <plugins>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.3.0</version>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <archive>
                    <manifest>
                       <!--             主类全限定名称-->
                        <mainClass>com.example.MainClass</mainClass>
                    </manifest>
                </archive>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
  1. mainClass 元素中指定主类的完全限定名,这是可执行 JAR 文件的入口点。


目录
相关文章
|
2月前
|
前端开发 JavaScript Java
SpringBoot项目部署打包好的React、Vue项目刷新报错404
本文讨论了在SpringBoot项目中部署React或Vue打包好的前端项目时,刷新页面导致404错误的问题,并提供了两种解决方案:一是在SpringBoot启动类中配置错误页面重定向到index.html,二是将前端路由改为hash模式以避免刷新问题。
229 1
|
10天前
|
Dubbo Java 应用服务中间件
深入探讨了“dubbo+nacos+springboot3的native打包成功后运行出现异常”的原因及解决方案
本文深入探讨了“dubbo+nacos+springboot3的native打包成功后运行出现异常”的原因及解决方案。通过检查GraalVM版本兼容性、配置反射列表、使用代理类、检查配置文件、禁用不支持的功能、查看日志文件、使用GraalVM诊断工具和调整GraalVM配置等步骤,帮助开发者快速定位并解决问题,确保服务的正常运行。
26 1
|
1月前
|
Java Docker 微服务
SpringBoot微服务打包Docker镜像
SpringBoot微服务打包Docker镜像
|
6月前
|
Java Maven
SpringBoot项目的用maven插件打包报Test错误
SpringBoot项目的用maven插件打包报Test错误
120 1
|
1月前
|
监控 Java Maven
springboot学习二:springboot 初创建 web 项目、修改banner、热部署插件、切换运行环境、springboot参数配置,打包项目并测试成功
这篇文章介绍了如何快速创建Spring Boot项目,包括项目的初始化、结构、打包部署、修改启动Banner、热部署、环境切换和参数配置等基础操作。
120 0
|
1月前
|
Java 应用服务中间件 Maven
SpringBoot Maven 项目打包的艺术--主清单属性缺失与NoClassDefFoundError的优雅解决方案
SpringBoot Maven 项目打包的艺术--主清单属性缺失与NoClassDefFoundError的优雅解决方案
311 0
|
1月前
|
监控 数据可视化 Java
springBoot:actuator&admin 图形可视化&spring 打包 (七)
本文介绍了Spring Boot Actuator及其图形化管理界面Spring Boot Admin的使用方法,包括依赖导入、服务端与客户端配置、以及如何打包为JAR和WAR文件并部署。通过这些步骤,可以实现应用的监控和管理功能。
|
3月前
|
Java Maven
构建Springboot项目、实现简单的输出功能、将项目打包成可以执行的JAR包(详细图解过程)
这篇文章详细介绍了构建SpringBoot项目的过程,包括新建工程、选择环境配置、添加依赖、项目结构说明,并演示了如何编写一个简单的Controller控制器实现输出功能,最后讲解了如何使用Maven将项目打包成可执行的JAR包,并提供了运行JAR包的命令和测试效果。
构建Springboot项目、实现简单的输出功能、将项目打包成可以执行的JAR包(详细图解过程)
|
6月前
|
Java
springboot打包错误:Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resource
springboot打包错误:Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resource
84 0
|
4月前
|
Java 持续交付 Maven
Spring Boot程序的打包与运行:构建高效部署流程
构建高效的Spring Boot部署流程对于保障应用的快速、稳定上线至关重要。通过采用上述策略,您可以确保部署过程的自动化、可靠性和高效性,从而将专注点放在开发上面。无论是通过Maven的生命周期命令进行打包,还是通过容器技术对部署过程进行优化,选择正确的工具与实践是成功实现这一目标的关键。
199 2