从 0 开始写一个springboot 初始体验项目
1.从 pom.xml 开始
以pom文件作为练习的开始。首先呢,创建一个 pom.xml 文件作为开始,内容如下:
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>myproject</artifactId> <version>0.0.1-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.1.BUILD-SNAPSHOT</version> </parent> <!-- Additional lines to be added here... --> <!-- (you don't need this if you are using a .RELEASE version) --> <repositories> <repository> <id>spring-snapshots</id> <url>https://repo.spring.io/snapshot</url> <snapshots><enabled>true</enabled></snapshots> </repository> <repository> <id>spring-milestones</id> <url>https://repo.spring.io/milestone</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>spring-snapshots</id> <url>https://repo.spring.io/snapshot</url> </pluginRepository> <pluginRepository> <id>spring-milestones</id> <url>https://repo.spring.io/milestone</url> </pluginRepository> </pluginRepositories> </project>
当前的文件结构如下:
. └── pom.xml
现在,尝试一下 mvn package
$ mvn package [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building myproject 0.0.1-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- maven-resources-plugin:3.0.1:resources (default-resources) @ myproject --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] skip non existing resourceDirectory /springboot-try/src/main/resources [INFO] skip non existing resourceDirectory /springboot-try/src/main/resources [INFO] [INFO] --- maven-compiler-plugin:3.7.0:compile (default-compile) @ myproject --- [INFO] No sources to compile [INFO] [INFO] --- maven-resources-plugin:3.0.1:testResources (default-testResources) @ myproject --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] skip non existing resourceDirectory /springboot-try/src/test/resources [INFO] [INFO] --- maven-compiler-plugin:3.7.0:testCompile (default-testCompile) @ myproject --- [INFO] No sources to compile [INFO] [INFO] --- maven-surefire-plugin:2.20.1:test (default-test) @ myproject --- [INFO] No tests to run. [INFO] [INFO] --- maven-jar-plugin:3.0.2:jar (default-jar) @ myproject --- [WARNING] JAR will be empty - no content was marked for inclusion! [INFO] Building jar: /springboot-try/target/myproject-0.0.1-SNAPSHOT.jar [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 2.297 s [INFO] Finished at: 2018-03-07T23:38:29+08:00 [INFO] Final Memory: 17M/227M [INFO] ------------------------------------------------------------------------
** 暂时先忽略 "[WARNING] JAR will be empty - no content was marked for inclusion!" **
2.添加 classpath 依赖
Springboot 提供很多starters 让你能够把需要的jar加入到classpath中,我们现在用的是 spring-boot-starter-parent 在 POM 的parent块,它是一个很特别的starter,同时也提供的一些maven有用的默认设置;同时也提供了dependency-management,所以不需要提供 version的标签了。
当我们需要开发更多需求的应用的时候,可能就会需要其他的starter提供的依赖。因为我们现在弄的是一个简单的web应用,所以我们需要spring-boot-starter-web的依赖,在这个操作之前,我们先来看看。
$ mvn dependency:tree [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building myproject 0.0.1-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- maven-dependency-plugin:3.0.1:tree (default-cli) @ myproject --- [INFO] com.example:myproject:jar:0.0.1-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1.760 s [INFO] Finished at: 2018-03-07T23:49:53+08:00 [INFO] Final Memory: 19M/227M [INFO] ------------------------------------------------------------------------
以上的command是打印出项目依赖的,可以看到 spring-boot-starter-parent 暂时是没有依赖的。所以我们需要在pom里面加上我们需要的依赖。
现在目录结构:
. ├── pom.xml └── target ├── maven-archiver │ └── pom.properties └── myproject-0.0.1-SNAPSHOT.jar
在 parent 块下面加上如下内容:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
保存之后,再运行:
$ mvn dependency:tree [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building myproject 0.0.1-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- maven-dependency-plugin:3.0.1:tree (default-cli) @ myproject --- [INFO] com.example:myproject:jar:0.0.1-SNAPSHOT [INFO] \- org.springframework.boot:spring-boot-starter-web:jar:2.0.1.BUILD-SNAPSHOT:compile [INFO] +- org.springframework.boot:spring-boot-starter:jar:2.0.1.BUILD-SNAPSHOT:compile [INFO] | +- org.springframework.boot:spring-boot:jar:2.0.1.BUILD-SNAPSHOT:compile [INFO] | +- org.springframework.boot:spring-boot-autoconfigure:jar:2.0.1.BUILD-SNAPSHOT:compile [INFO] | +- org.springframework.boot:spring-boot-starter-logging:jar:2.0.1.BUILD-SNAPSHOT:compile [INFO] | | +- ch.qos.logback:logback-classic:jar:1.2.3:compile [INFO] | | | +- ch.qos.logback:logback-core:jar:1.2.3:compile [INFO] | | | \- org.slf4j:slf4j-api:jar:1.7.25:compile [INFO] | | +- org.apache.logging.log4j:log4j-to-slf4j:jar:2.10.0:compile [INFO] | | | \- org.apache.logging.log4j:log4j-api:jar:2.10.0:compile [INFO] | | \- org.slf4j:jul-to-slf4j:jar:1.7.25:compile [INFO] | +- javax.annotation:javax.annotation-api:jar:1.3.2:compile [INFO] | +- org.springframework:spring-core:jar:5.0.5.BUILD-SNAPSHOT:compile [INFO] | | \- org.springframework:spring-jcl:jar:5.0.5.BUILD-SNAPSHOT:compile [INFO] | \- org.yaml:snakeyaml:jar:1.19:runtime [INFO] +- org.springframework.boot:spring-boot-starter-json:jar:2.0.1.BUILD-SNAPSHOT:compile [INFO] | +- com.fasterxml.jackson.core:jackson-databind:jar:2.9.4:compile [INFO] | | +- com.fasterxml.jackson.core:jackson-annotations:jar:2.9.0:compile [INFO] | | \- com.fasterxml.jackson.core:jackson-core:jar:2.9.4:compile [INFO] | +- com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:2.9.4:compile [INFO] | +- com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:2.9.4:compile [INFO] | \- com.fasterxml.jackson.module:jackson-module-parameter-names:jar:2.9.4:compile [INFO] +- org.springframework.boot:spring-boot-starter-tomcat:jar:2.0.1.BUILD-SNAPSHOT:compile [INFO] | +- org.apache.tomcat.embed:tomcat-embed-core:jar:8.5.28:compile [INFO] | +- org.apache.tomcat.embed:tomcat-embed-el:jar:8.5.28:compile [INFO] | \- org.apache.tomcat.embed:tomcat-embed-websocket:jar:8.5.28:compile [INFO] +- org.hibernate.validator:hibernate-validator:jar:6.0.7.Final:compile [INFO] | +- javax.validation:validation-api:jar:2.0.1.Final:compile [INFO] | +- org.jboss.logging:jboss-logging:jar:3.3.2.Final:compile [INFO] | \- com.fasterxml:classmate:jar:1.3.4:compile [INFO] +- org.springframework:spring-web:jar:5.0.5.BUILD-SNAPSHOT:compile [INFO] | \- org.springframework:spring-beans:jar:5.0.5.BUILD-SNAPSHOT:compile [INFO] \- org.springframework:spring-webmvc:jar:5.0.5.BUILD-SNAPSHOT:compile [INFO] +- org.springframework:spring-aop:jar:5.0.5.BUILD-SNAPSHOT:compile [INFO] +- org.springframework:spring-context:jar:5.0.5.BUILD-SNAPSHOT:compile [INFO] \- org.springframework:spring-expression:jar:5.0.5.BUILD-SNAPSHOT:compile [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 2.087 s [INFO] Finished at: 2018-03-07T23:55:58+08:00 [INFO] Final Memory: 20M/227M [INFO] ------------------------------------------------------------------------
这个时候,我们就看到加了好多依赖,包括了 tomcat web server 和 springboot
3.写代码
到这里,pom文件的准备先暂停一下,我们来撸一下代码来测试一波,创建一个Java文件来玩玩,嘻嘻。
Maven会默认的从src/main/java作为源文件的路径来进行构建,所以我们需要创建一个这个文件路径。
$ mkdir -p ./src/main/java # 文件结构如下: . ├── pom.xml ├── src │ └── main │ └── java └── target ├── maven-archiver │ └── pom.properties └── myproject-0.0.1-SNAPSHOT.jar
新建的java文件内容如下(/src/main/java/Example.java):
import org.springframework.boot.*; import org.springframework.boot.autoconfigure.*; import org.springframework.web.bind.annotation.*; @RestController @EnableAutoConfiguration public class Example { @RequestMapping("/") String home() { return "Hello World!"; } public static void main(String[] args) throws Exception { SpringApplication.run(Example.class, args); } }
关于 @RestController、@EnableAutoConfiguration、@RequestMapping暂不说明。保存之后就可以运行了。
$ mvn spring-boot:run # 下载文件和一些处理操作之后 :: Spring Boot :: (v2.0.1.BUILD-SNAPSHOT) 2018-03-08 00:06:42.448 INFO 3176 --- [ main] Example # 由于某些原因,logo变样了,就不给看了,抱歉。 $ curl http://localhost:8080 Hello World!
到这里,我们基本就是体验了一波,从pom到运行一个spring 的web应用。还差一步,那就是打包咯。
为了能够打包出来,然后放到任何地方都能运行的jar,需要在做一些改进。我们需要创建一个可执行的jar。 在pom文件的dependencies块下面填入下内容:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
现在的文件结构:
. ├── pom.xml ├── src │ └── main │ └── java │ └── Example.java └── target ├── classes │ └── Example.class ├── generated-sources │ └── annotations ├── maven-archiver │ └── pom.properties ├── maven-status │ └── maven-compiler-plugin │ └── compile │ └── default-compile │ ├── createdFiles.lst │ └── inputFiles.lst └── myproject-0.0.1-SNAPSHOT.jar
保存之后,开始打包。
mvn package [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building myproject 0.0.1-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- maven-resources-plugin:3.0.1:resources (default-resources) @ myproject --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] skip non existing resourceDirectory /Users/wuyingqiang/WYQDir/Springboot/springboot-try/src/main/resources [INFO] skip non existing resourceDirectory /Users/wuyingqiang/WYQDir/Springboot/springboot-try/src/main/resources [INFO] [INFO] --- maven-compiler-plugin:3.7.0:compile (default-compile) @ myproject --- [INFO] Nothing to compile - all classes are up to date [INFO] [INFO] --- maven-resources-plugin:3.0.1:testResources (default-testResources) @ myproject --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] skip non existing resourceDirectory /Users/wuyingqiang/WYQDir/Springboot/springboot-try/src/test/resources [INFO] [INFO] --- maven-compiler-plugin:3.7.0:testCompile (default-testCompile) @ myproject --- [INFO] No sources to compile [INFO] [INFO] --- maven-surefire-plugin:2.20.1:test (default-test) @ myproject --- [INFO] No tests to run. [INFO] [INFO] --- maven-jar-plugin:3.0.2:jar (default-jar) @ myproject --- [INFO] Building jar: /Users/wuyingqiang/WYQDir/Springboot/springboot-try/target/myproject-0.0.1-SNAPSHOT.jar [INFO] [INFO] --- spring-boot-maven-plugin:2.0.1.BUILD-SNAPSHOT:repackage (default) @ myproject --- [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 3.204 s [INFO] Finished at: 2018-03-08T00:16:37+08:00 [INFO] Final Memory: 24M/315M [INFO] ------------------------------------------------------------------------
打包完之后的目录结构如下:
. ├── pom.xml ├── src │ └── main │ └── java │ └── Example.java └── target ├── classes │ └── Example.class ├── generated-sources │ └── annotations ├── maven-archiver │ └── pom.properties ├── maven-status │ └── maven-compiler-plugin │ └── compile │ └── default-compile │ ├── createdFiles.lst │ └── inputFiles.lst ├── myproject-0.0.1-SNAPSHOT.jar └── myproject-0.0.1-SNAPSHOT.jar.original
myproject-0.0.1-SNAPSHOT.jar.original 是 maven在springboot打包之前的源文件。
在这里,我们简单的走了一下入门的流程了。那先这样,后面继续更新。。。
4.参考来源
Spring Boot Reference Guide