前言
使用maven打可执行jar包,spring和springboot中有点区别(感觉用处不大,因为可执行jar包几乎需要容器IOC支持,甚至要Aop事务,而默认jar都是Appclication.java入口的)
1:spring中的打包
<project>
[...]
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>cn.faceland.springboot.task.PrintTask</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
[...]
</project>
2:springboot的打包
springboot用上面的方式打包会报错:“ Cannot find ‘resource’ in class org.apache.maven.plugins.shade.resource.ManifestResourceTransformer -> [Help 1]”
处理:springboot本身就带有自己的打包插件,spring-boot-maven-plugin 这个插件就可以完成打包的工作。如果画蛇添足引用了Shade反而会导致一些冲突。
<project>
[...]
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.5.4.RELEASE</version>
<configuration>
<mainClass>${start-class}</mainClass>
<layout>ZIP</layout>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
[...]
</project>
- 1:将生成的jar拖到桌面上,
- 2:然后WIN + R键打开命令窗口,
- 3:输入 java -jar 并把jar拖到命令窗口中,
- 4:然后回车键运行即可
### 3:可执行jar有没有集成tomcat的区别
- 1:集成了tomcat
java -jar xxxx.jar
经实验,无论是windows,还是linux,命令窗口保持打开,则项目一直正常运行,且端口保持占用。如果在linux使用crontab定时触发,一样,项目依然正常运行,后面每次触发都会端口占用错误。 (虽然这个定时任务触发的思想很奇怪,类似于定时重复启动tomcat一样,但为了好奇,还是测试了番,果真如此)
- 2:不集成tomcat
做法:注释掉spring-boot-start-web
<!--<dependency>--> <!--<groupId>org.springframework.boot</groupId>--> <!--<artifactId>spring-boot-starter-web</artifactId>--> <!--</dependency>-->
idea上run项目的Application.java是就会发现没有端口号打印。 打包成jar在上述方式中运行测试,发现启动只有一次性。可重复运行。
如果再配合启动回调。就能够实现一次性的任务,且支持动态传参(参考本站帖子:springboot启动回调)。
4:如何把可运行jar改造成监听器(不集成tomcat)
可以考虑在jar的main方法,或者runner方法中设计:
while(true){
//do something
//例如查库表,查缓存,等等,查到了再做一些处理
//为了节省资源,可以Thread.sleep(0.5秒、若干秒);等
}
引用: