优秀的编程知识分享平台

网站首页 > 技术文章 正文

SpringBoot 2.0 实战专车系列三:应用启动方式

nanyue 2024-09-03 16:36:30 技术文章 5 ℃

专车介绍

该趟专车是开往 SpringBoot 应用启动方式的实战专车,主要讲解通过多种方式来启动 SpringBoot 应用

专车问题

第一个问题:SpringBoot 可以通过哪些方式来启动应用

专车实战

本实战示例以 boot-example-web 模块为样例代码

方式一:通过 main 函数来启动 SpringBoot 应用

@SpringBootApplication
public class WebApplication {

    public static void main(String[] args) {
        SpringApplication.run(WebApplication.class, args);
    }
}

直接运行如上的 main 函数,就可以启动我们的应用,看到如下日志展示,说明应用启动成功

2019-10-22 09:52:40.425  INFO 7086 --- [           main] com.boot.example.WebApplication          : No active profile set, falling back to default profiles: default
2019-10-22 09:52:41.561  INFO 7086 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2019-10-22 09:52:41.587  INFO 7086 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2019-10-22 09:52:41.588  INFO 7086 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.21]
2019-10-22 09:52:41.697  INFO 7086 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2019-10-22 09:52:41.697  INFO 7086 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1224 ms
2019-10-22 09:52:41.950  INFO 7086 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2019-10-22 09:52:42.104  INFO 7086 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2019-10-22 09:52:42.107  INFO 7086 --- [           main] com.boot.example.WebApplication          : Started WebApplication in 2.0 seconds (JVM running for 2.537)
2019-10-22 09:52:50.136  INFO 7086 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2019-10-22 09:52:50.136  INFO 7086 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2019-10-22 09:52:50.141  INFO 7086 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 5 ms

如果启动失败,可以查看具体日志信息,看看是否端口被占用,端口占用错误信息

Caused by: java.net.BindException: Address already in use

方式二:通过 maven 的方式来启动 SpringBoot 应用

首先需要添加 SpringBoot maven 插件

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

执行如下命令:

?  boot-example git:(master) ? cd boot-example-web
?  boot-example-web git:(master) ? mvn spring-boot:run

如果启动成功可以看到如下日志信息:

[INFO] Scanning for projects...
[INFO]
[INFO] -----------------< com.boot.example:boot-example-web >------------------
[INFO] Building boot-example-web 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] >>> spring-boot-maven-plugin:2.1.6.RELEASE:run (default-cli) > test-compile @ boot-example-web >>>
[INFO]
[INFO] --- maven-resources-plugin:3.0.2:resources (default-resources) @ boot-example-web ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /Users/pengli/software/idea/workspace/boot-example/boot-example-web/src/main/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.2:compile (default-compile) @ boot-example-web ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 5 source files to /Users/pengli/software/idea/workspace/boot-example/boot-example-web/target/classes
[INFO]
[INFO] --- maven-resources-plugin:3.0.2:testResources (default-testResources) @ boot-example-web ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /Users/pengli/software/idea/workspace/boot-example/boot-example-web/src/test/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.2:testCompile (default-testCompile) @ boot-example-web ---
[INFO] No sources to compile
[INFO]
[INFO] <<< spring-boot-maven-plugin:2.1.6.RELEASE:run (default-cli) < test-compile @ boot-example-web <<<
[INFO]
[INFO]
[INFO] --- spring-boot-maven-plugin:2.1.6.RELEASE:run (default-cli) @ boot-example-web ---

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

2019-10-22 09:56:12.163  INFO 7249 --- [           main] com.boot.example.WebApplication          : Starting WebApplication on pengdeMacBook-Pro.local with PID 7249 (....../workspace/boot-example/boot-example-web/target/classes started by pengli in ......./workspace/boot-example/boot-example-web)
2019-10-22 09:56:12.166  INFO 7249 --- [           main] com.boot.example.WebApplication          : No active profile set, falling back to default profiles: default
2019-10-22 09:56:13.296  INFO 7249 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2019-10-22 09:56:13.332  INFO 7249 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2019-10-22 09:56:13.332  INFO 7249 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.21]
2019-10-22 09:56:13.445  INFO 7249 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2019-10-22 09:56:13.446  INFO 7249 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1232 ms
2019-10-22 09:56:13.689  INFO 7249 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2019-10-22 09:56:13.949  INFO 7249 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2019-10-22 09:56:13.953  INFO 7249 --- [           main] com.boot.example.WebApplication          : Started WebApplication in 2.277 seconds (JVM running for 6.671)
2019-10-22 09:56:21.437  INFO 7249 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'

方式三:以 jar 包的方式启动

在控制台下执行如下面命令:

?  boot-example-web git:(master) ? mvn clean package -X

再依次执行如下命令:

?  boot-example-web git:(master) ? cd target
?  target git:(master) ? ls
boot-example-web-1.0-SNAPSHOT.jar generated-sources                 maven-status
classes                           maven-archiver
?  target git:(master) ? java -jar boot-example-web-1.0-SNAPSHOT.jar

理想的情况下,我们的 SpringBoot 应用应该可以启动起来,但是实际下回看到如下错误:

boot-example-web-1.0-SNAPSHOT.jar中没有主清单属性

解决方法:在上面的插件中添加额外的配置信息

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                            <goal>build-info</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

然后重新打包,重新运行

?  target git:(master) ? java -jar boot-example-web-1.0-SNAPSHOT.jar

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

2019-10-22 10:04:56.007  INFO 7497 --- [           main] com.boot.example.WebApplication          : Starting WebApplication on .... with PID 7497 (...../boot-example/boot-example-web/target/boot-example-web-1.0-SNAPSHOT.jar started by pengli in ...../boot-example/boot-example-web/target)
2019-10-22 10:04:56.010  INFO 7497 --- [           main] com.boot.example.WebApplication          : No active profile set, falling back to default profiles: default
2019-10-22 10:04:57.143  INFO 7497 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2019-10-22 10:04:57.170  INFO 7497 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2019-10-22 10:04:57.170  INFO 7497 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.21]
2019-10-22 10:04:57.271  INFO 7497 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2019-10-22 10:04:57.271  INFO 7497 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1221 ms
2019-10-22 10:04:57.508  INFO 7497 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2019-10-22 10:04:57.765  INFO 7497 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2019-10-22 10:04:57.769  INFO 7497 --- [           main] com.boot.example.WebApplication          : Started WebApplication in 2.134 seconds (JVM running for 2.526)
2019-10-22 10:05:00.280  INFO 7497 --- [nio-8080-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2019-10-22 10:05:00.280  INFO 7497 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2019-10-22 10:05:00.285  INFO 7497 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet        : Completed initialization in 5 ms

可以看到添加配置之后,SpringBoot 应用就可以正常的启动了,接下来我们来看看官方针对新增配置的一个说明:

repackage: create a jar or war file that is auto-executable. It can replace the regular artifact or can be attached to the build lifecycle with a separate classifier.

官方的大致意思就是:repackage 命令可以创建一个可自动执行的 jar 或者 war。它可以替换常规工件,或者可以使用单独的分类器附加到构建生命周期。

专车总结

SpringBoot 应用可以通过 main 函数、mvn 插件、jar 包这三种方式进行启动。使用 jar 方式启动,一定要在插件中配置 repackage

最近发表
标签列表