创建可执行jar
创建一个完全自包含的可执行jar文件,该jar文件可以在生产环境运行。可执行jars(有时候被称为胖jars "fat jars")是包含你的编译后的类和你的代码运行所需的依赖jar的存档。
可执行jars在Java没有提供任何标准的加载内嵌jar文件(即jar文件中还包含jar文件)的方法。如果想发布一个自包含的应用这就是一个问题。为了解决该问题,很多开发者采用"共享的"jars。一个共享的jar简单地将来自所有jars的类打包进一个单独的“超级jar”。采用共享jar方式的问题是很难区分在应用程序中可以使用哪些库。在多个jars中如果存在相同的文件名(但内容不一样)也会是一个问题。Spring Boot采取一个不同的途径,并允许你真正的内嵌jars。
为了创建可执行的jar,需要将spring-boot-maven-plugin添加到我们的pom.xml中。在dependencies节点下插入以下内容:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
注意:spring-boot-starter-parent POM包含用于绑定repackage目标的配置。如果你不使用parent POM,你将需要自己声明该配置。
保存pom.xml配置文件,然后从命令行运行mvn package命令,具体执行如下:
$ mvn package
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building myproject 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] .... ..
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ myproject ---
[INFO] Building jar: /Users/developer/example/spring-boot-example/target/myproject-0.0.1-SNAPSHOT.jar
[INFO]
[INFO] --- spring-boot-maven-plugin:1.3.0.BUILD-SNAPSHOT:repackage (default) @ myproject ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
查看target目录,应该看到myproject-0.0.1-SNAPSHOT.jar。该文件应该有10Mb左右的大小。如果想看内部结构,你可以运行jar tvf命令:
$ jar tvf target/myproject-0.0.1-SNAPSHOT.jar
在target目录下,应该也能看到一个很小的名为myproject-0.0.1-SNAPSHOT.jar.original的文件。这是在Spring Boot重新打包前Maven创建的原始jar文件。
$ java -jar target/myproject-0.0.1-SNAPSHOT.jar
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v1.3.0.BUILD-SNAPSHOT)
....... . . .
....... . . . (log output here)
....... . . .
........ Started Example in 2.536 seconds (JVM running for 2.864)
快捷键ctrl+c退出程序。
热部署
spring-boot-devtools是一个为开发者服务的一个模块,其中最重要的功能就是自动的将应用更改的代码到上传至应用中,即在开发人员改变了一些代码或者配置文件时,应用可以自动重启,相信这功能对于开发人员来说的话是非常有用的,称之为热部署(热加载)。
Spring Boot 1.3引入了devtools,这是一个在Spring Boot应用程序上工作时提高开发时间效率的模块。要启用它,只需将以下依赖项添加到项目中:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>1.5.6.RELEASE</version>
<optional>true</optional>
</dependency>
</dependencies>
当devtools运行时,如果重新编译应用程序并自动刷新,它会检测到更改。这不仅适用于资源,还适用于代码。它还提供一个LiveReload服务器以便每当事情发生变化时,它可以自动触发浏览器刷新。
Devtools可以配置为仅在静态资源已更改时才刷新浏览器(并忽略代码中的任何更改)。只需在项目中包含以下属性:
spring.devtools.remote.restart.enabled=false
在devtools之前,该插件默认情况下支持热备份资源,但是目前已经被禁用了,如果需要使用,可以随时通过配置项目来恢复它,具体配置信息如下:
<build>
...
<plugins>
...
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.5.6.RELEASE</version>
<configuration>
<addResources>true</addResources>
</configuration>
</plugin>
...
</plugins>
...
</build>
当启用addResources时,如果运行应用程序,任何src/main/resources文件夹将被添加到应用程序类路径,并且将删除在target/classes中找到的任何重复项。这样可以让刷新资源更加清晰,这在开发web应用程序时非常有用。在使用HTML,CSS或JavaScript文件,可以立即查看更改而无需重新编译应用程序,这使得前端开发人员无需下载和安装Java IDE。
默认情况下,修改/META-INF/maven,/META-INF/resources,/resources,/static,/public或者/templates目录下的内容不会引起应用的重新启动。意思是java代码,pom文件,application.properties(yml)文件的修改都会引起重新启动。
通过以下方式,可以指定只有哪些目录下的内容修改不会引起重启:
spring.devtools.restart.exclude=static/**,public/**
以上配置说明只有static目录和public目录下的内容修改后不会引起重启。由于默认的配置已经比较合理,所以我们进行上述配置,一种可能的情况是希望在默认的配置下,添加其他目录下内容修改时也不重新启动,将spring.devtools.restart.exclude改为spring.devtools.restart.additional-exclude即可。
注意:
1)使用此功能的副作用是在构建时过滤资源将不起作用。
2)为了与重新包装目标保持一致,运行目标以这样的方式构建类路径,即插件配置中排除的任何依赖项也从类路径中排除。
3)在运行应用程序时包含测试依赖关系此功能是有用的。例如,如果要在使用存根类的测试模式下运行应用程序。可以将useTestClasspath参数设置为true。注意的是这仅适用于运行应用程序时而重新打包目标不会将测试依赖关系添加到生成的JAR/WAR。