springboot中Maven打包与依赖的jar分开

ゞ 浴缸里的玫瑰 2021-12-01 13:24 457阅读 0赞

spring boot添加spring-boot-maven-plugin插件后, 打出来的Jar动辄几十上百兆. 这种FatJar包在传输时会相当不便, 上传速度可能不到200K, 严重影响工作效率.

  1. <build>
  2. <finalName>alex-drcs01-rest</finalName>
  3. <plugins>
  4. <plugin>
  5. <groupId>org.springframework.boot</groupId>
  6. <artifactId>spring-boot-maven-plugin</artifactId>
  7. <configuration>
  8. <!-- 指定该jar包启动时的主类[建议] -->
  9. <mainClass>com.alex.hainan.ServerStart</mainClass>
  10. <includes>
  11. <include>
  12. <groupId>nothing</groupId>
  13. <artifactId>nothing</artifactId>
  14. </include>
  15. </includes>
  16. </configuration>
  17. </plugin>
  18. <plugin>
  19. <groupId>org.apache.maven.plugins</groupId>
  20. <artifactId>maven-compiler-plugin</artifactId>
  21. <configuration>
  22. <!-- 剔除spring-boot打包的org和BOOT-INF文件夹(用于子模块打包) -->
  23. <skip>true</skip>
  24. <source>1.8</source>
  25. <target>1.8</target>
  26. <encoding>UTF-8</encoding>
  27. </configuration>
  28. </plugin>
  29. <plugin>
  30. <groupId>org.apache.maven.plugins</groupId>
  31. <artifactId>maven-dependency-plugin</artifactId>
  32. <executions>
  33. <execution>
  34. <id>copy</id>
  35. <phase>package</phase>
  36. <goals>
  37. <goal>copy-dependencies</goal>
  38. </goals>
  39. <configuration>
  40. <outputDirectory>
  41. ${project.build.directory}/lib
  42. </outputDirectory>
  43. </configuration>
  44. </execution>
  45. </executions>
  46. </plugin>
  47. <plugin>
  48. <groupId>org.apache.maven.plugins</groupId>
  49. <artifactId>maven-jar-plugin</artifactId>
  50. <configuration>
  51. <archive>
  52. <manifest>
  53. <addClasspath>true</addClasspath>
  54. <classpathPrefix>lib/</classpathPrefix>
  55. <mainClass>${start-class}</mainClass>
  56. </manifest>
  57. </archive>
  58. </configuration>
  59. </plugin>
  60. </plugins>
  61. <resources>
  62. <resource>
  63. <directory>src/main/java</directory>
  64. <includes>
  65. <include>**/*.xml</include>
  66. </includes>
  67. <!-- 是否替换资源中的属性 -->
  68. <filtering>false</filtering>
  69. </resource>
  70. <resource>
  71. <directory>src/main/resources</directory>
  72. <includes>
  73. <include>**/*</include>
  74. </includes>
  75. </resource>
  76. </resources>
  77. <defaultGoal>compile</defaultGoal>
  78. </build>
  79. java -Dloader.path="lib/" -jar *.jar
  80. 后台启动
  81. nohup java -jar 自己的springboot项目.jar >日志文件名.log 2>&1 &
  82. 命令详解:
  83. nohup:不挂断地运行命令,退出帐户之后继续运行相应的进程。
  84. >日志文件名.log:是nohup把command的输出重定向到当前目录的指定的“日志文件名.log”文件中,即输出内容不打印到屏幕上,而是输出到”日志文件名.log”文件中。不指定文件名会在当前目录创建nohup.out,如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。
  85. 2>&1:2就是标准错误,1是标准输出,该命令相当于把标准错误重定向到标准输出么。这里&相当于标准错误等效于标准输出,即把标准错误和标准输出同时输出到指定的“日志文件名.log”文件中。
  86. java -jar 自己的springboot项目.jar:执行springboot的项目,如果单单只执行该命令,linux只会短暂的运行该项目,当退出控制台后会自动关闭该项目。
  87. 最后的&:让改作业在后台运行。
  88. java -Dio.netty.leakDetectionLevel=advanced -server -XX:+PrintGCDetails -Xloggc:/usr/local/logs/gc.log -XX:+PrintGCTimeStamps -Dons.client.logRoot=/usr/local/logs -Dons.client.logLevel=WARN -Dons.client.logFileMaxIndex=20 -Djava.security.egd=file:/dev/./urandom -Dloader.path=lib/ -jar *.jar
  89. #内存分配large
  90. #java -Dio.netty.leakDetectionLevel=advanced -server -Xms4g -Xmx4g -Xmn2g -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+PrintGCDetails -Xloggc:/usr/local/logs/gc.log -XX:+PrintGCTimeStamps -Dons.client.logRoot=/usr/local/logs -Dons.client.logLevel=WARN -Dons.client.logFileMaxIndex=20 -Djava.security.egd=file:/dev/./urandom -jar *.jar

loader.path指向了外置目录,告诉springboot允许从外部加载依赖.

loader.path的更多用法参见:http://docs.spring.io/spring-boot/docs/current/reference/html/executable-jar.html#executable-jar-launching.

可以用mvn dependency:copy-dependencies命令将jar包copy到这个外置目录.

经测试, 经过上面的两个步骤, 笔者的应用从70MB缩小为1.3MB, 极大地缩小了体积.

既缩小了体积, 便于传输, 又很容易地控制依赖jar的版本, 做到全公司统一, 共享同一套依赖集合.

特别地,注意layout应设置为ZIP,不然后面会出现找不到类的错误.未出现

发表评论

表情:
评论列表 (有 0 条评论,457人围观)

还没有评论,来说两句吧...

相关阅读