您的位置:首页 > 编程语言 > Java开发

[笔记]spring boot打包jar和war

2017-06-16 15:01 549 查看
打包jar

Spring官网Guides下任意一个例子,比如最简单的Building a RESTful Web Service

打包war

参考Spring Boot文档 Traditional deployment 85.1 Create a deployable war file

或例程 spring-boot-sample-war

按例程看,如果
@SpringBootApplication
的class直接继承了
SpringBootServletInitializer
,不用重写
config
方法也是可以的(
builder.main(getClass())
、get的就是应用class)。

打包一个又能发布于tomcat又能
java -jar
直接跑的war

2的参考文档里有:

If you’re using the Spring Boot build tools, marking the embedded servlet container dependency as provided will produce an executable war file with the provided dependencies packaged in a lib-provided directory.

另外:

Maven 66.2 Packaging executable jar and war files

Gradle 67.3 Packaging executable jar and war files

观察几种配置的发布包子目录和其下jar包,并比较MENIFEST.MF:

bootRun时有:

Start-Class: hello.Application
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Main-Class: org.springframework.boot.loader.JarLauncher


不过关心的是war包:

Start-Class: hello.Application
Spring-Boot-Classes: WEB-INF/classes/
Spring-Boot-Lib: WEB-INF/lib/
Main-Class: org.springframework.boot.loader.WarLauncher


应该是丢给tomcat时、tomcat只检查servlet定义的WEB-INF/lib路径,但
java -jar
时、Spring的WarLauncher还引入了存放着tomcat相关jar的
lib-provided
目录:

@Override
public boolean isNestedArchive(Archive.Entry entry) {
if (entry.isDirectory()) {
return entry.getName().equals(WEB_INF_CLASSES);
}
else {
return entry.getName().startsWith(WEB_INF_LIB)
|| entry.getName().startsWith(WEB_INF_LIB_PROVIDED);
}
}


所以两种都能跑。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: