从 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打包之前的源文件。
在这里,我们简单的走了一下入门的流程了。那先这样,后面继续更新。。。