springBoot打包- 部署- 发布到私服的问题
一、打成jar部署
利用springboot的插件打包
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin>
打jar的小细节
当有引入本地jar配置,如下图
pom.xml配置如下
<dependency> <groupId>eis_protobuf</groupId> <artifactId>eis_protobuf</artifactId> <version>1.0</version> <scope>system</scope> <systemPath>${project.basedir}/lib/eis_protobuf.jar</systemPath> </dependency>
springboot-maven-plugin打包的第一级目录为Boot-INF,如果不做任何配置,直接mvn clean package会发现无法把本地的jar打进Boot-INF中,则此时要做如下配置
方法一
在pom.xml的resources节点添加如下内容
<resource> <directory>lib</directory> <targetPath>BOOT-INF/lib/</targetPath> <includes> <include>**/*.jar</include> </includes> </resource>
ps: 如果遇到一些外部配置文件比如mybatis的mapper文件或者activiti生成器的json文件,则也要把相应的文件打进resources中,否则项目启动会因找不到配置文件,而报错,配置文件如下
<resource> <directory>${basedir}/src/main/java</directory> <filtering>false</filtering> <includes> <include>**/*.xml</include> <include>**/*.properties</include> </includes> </resource> <resource> <directory>${basedir}/src/main/resources</directory> <filtering>true</filtering> <excludes> <exclude>templates/**</exclude> <exclude>static/**</exclude> </excludes> <includes> <include>**/*.xml</include> <include>**/*.yml</include> <include>**/*.yaml</include> <include>**/*.properties</include> <include>**/*.key</include> <include>**/*.des</include> <include>**/*.template</include> <include>**/*.json</include> </includes> </resource>
方法二
在spring-boot-maven-plugin插件中设置includeSystemScope参数
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <includeSystemScope>true</includeSystemScope> </configuration> </plugin> </plugins> </build>
二 把sprinboot部署到外部tomcat
1、修改打包方式,把jar改成war,改成如下配置
<packaging>war</packaging>
2、引入tomcat依赖jar,scope范围为provided,并排除springboot内嵌的tomcat依赖jar,其实不排除也没关系,不影响项目运行
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency>
3、修改打包插件,不使用spring-boot-maven-plugin插件打包,因为这个打包插件会把jar打包在Boot-INF目录下导致别的项目引用时引用不到,此时改用maven-war-plugin打包,具体配置如下
<plugin> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin>
--------------------华丽的分割线-----------以下是类似问题, 也可以删除这部分配置------------
最近在开发过程中发现一个项目引用了一个其他项目的jar,但是使用过程中报错,一直无法访问,观察后发现引用的jar包中是BOOT-INF(坑爹啊)的文件夹,其中还包含了lib,查看maven库中的文件比之前发布的文件异常大,在100M左右,之前的才几百KB。
在网络上找了些方法也没有用,后面发现引用项目的POM文件存在问题,在POM文件中有下面这一段话
查询后发现这段是个maven打包插件,会包文件打包成一个可执行文件,就会出现BOOT-INF中,而且会把所有的jar包打入,所以解释了生成的jar为什么这么大,解决办法就是把这一段话注释掉,然后重新打包即可,生成的文件恢复大几百KB。
在这边写篇文章记录下, 因为这个问题导致浪费了一个小时左右。如果你也出现了这个问题,请看看该项目的POM文件。谢谢!
4、修改启动类,启动类继承SpringBootServletInitializer,并重写configure方法
@SpringBootApplicationpublic class SpringbootDemo extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(SpringbootDemo.class); } public static void main(String[] args) { new SpringApplicationBuilder(SpringbootDemo.class).web(true).run(args); } }