• Java打包jar包的全部方式


    1. spring-boot-maven-plugin插件(在springboot项目中使用)

    1. <plugin>
    2. <groupId>org.springframework.bootgroupId>
    3. <artifactId>spring-boot-maven-pluginartifactId>
    4. <executions>
    5. <execution>
    6. <goals>
    7. <goal>repackagegoal>
    8. goals>
    9. <configuration>
    10. <classifier>spring-bootclassifier>
    11. <mainClass>
    12. com.xy.Application
    13. mainClass>
    14. configuration>
    15. execution>
    16. executions>
    17. plugin>

    2. shade插件(推荐)

    执行mvn package后,会在target文件夹下生成两个jar包,一个是不带依赖的jar包,一个是后缀有-shaded带有依赖的jar包。 

    1. <plugin>
    2. <groupId>org.apache.maven.pluginsgroupId>
    3. <artifactId>maven-shade-pluginartifactId>
    4. <version>2.4.1version>
    5. <executions>
    6. <execution>
    7. <phase>packagephase>
    8. <goals>
    9. <goal>shadegoal>
    10. goals>
    11. <configuration>
    12. <transformers>
    13. <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
    14. <mainClass>com.my.jvm.AssemblyTestmainClass>
    15. transformer>
    16. transformers>
    17. configuration>
    18. execution>
    19. executions>
    20. plugin>

    3. assembly插件(spring项目可能会报错)

    执行mvn package后,会在target文件夹下生成两个jar包,一个是不带依赖的jar包,一个是后缀有-dependencies带有依赖的jar包。

    1. <plugin>
    2. <groupId>org.apache.maven.pluginsgroupId>
    3. <artifactId>maven-assembly-pluginartifactId>
    4. <configuration>
    5. <archive>
    6. <manifest>
    7. <mainClass>com.my.jvm.AssemblyTestmainClass>
    8. manifest>
    9. archive>
    10. <descriptorRefs>
    11. <descriptorRef>
    12. jar-with-dependencies
    13. descriptorRef>
    14. descriptorRefs>
    15. configuration>
    16. plugin>

    4. maven-jar-plugin插件

    最终打出来的jar包,没有其他依赖包,第三方依赖包集中放在 lib文件夹下。

    addClasspath:是否在manifest文件中添加classpath。默认为false。如果为true,则会在manifest文件中添加classpath,这样在启动的时候就不用再手动指定classpath了。

    1. <plugin>
    2. <artifactId>maven-jar-pluginartifactId>
    3. <executions>
    4. <execution>
    5. <id>make-a-jarid>
    6. <phase>compilephase>
    7. <goals>
    8. <goal>jargoal>
    9. goals>
    10. execution>
    11. executions>
    12. <configuration>
    13. <archive>
    14. <manifest>
    15. <addClasspath>trueaddClasspath>
    16. <classpathPrefix>lib/classpathPrefix>
    17. <mainClass>com.my.jvm.AssemblyTestmainClass>
    18. manifest>
    19. archive>
    20. <excludes>
    21. <exclude>*.propertiesexclude>
    22. <exclude>*.txtexclude>
    23. excludes>
    24. configuration>
    25. plugin>

    5. maven-dependency-plugin插件

    这个插件似乎并不能直接打成可执行jar,它的常见的作用是把依赖集中起来放在lib文件夹下,经常配合maven-jar-plugin或者spring-boot-maven-plugin使用。

    1. <plugin>
    2. <groupId>org.apache.maven.pluginsgroupId>
    3. <artifactId>maven-dependency-pluginartifactId>
    4. <executions>
    5. <execution>
    6. <id>copy-dependenciesid>
    7. <phase>prepare-packagephase>
    8. <goals>
    9. <goal>copy-dependenciesgoal>
    10. goals>
    11. <configuration>
    12. <outputDirectory>
    13. ${project.build.directory}/libs
    14. outputDirectory>
    15. configuration>
    16. execution>
    17. executions>
    18. plugin>

    6. 手动修改打包配置(不推荐)

    /META-INF/ MANIFEST.MF

    普通的jar包:

    Manifest-Version: 1.0Archiver-Version: Plexus ArchiverBuilt-By: AdministratorCreated-By: Apache Maven 3.3.3Build-Jdk: 1.8.0_171

    要变成可执行jar包,需要指定main

    Main-Class:com.my.jvm.AssemblyTest

    如果jar包有依赖其他第三方jar,还要指定Class-Path

    Class-Path:lib/log4j-1.2.17.jar lib/slf4j-log4j12-1.7.21.jar lib/slf4

     7.项目瘦身方式

    把固定的不会经常变的第三方jar提前放在服务器上,每次只要更新自己的业务代码jar包即可

    1. <build>
    2. <plugins>
    3. <plugin>
    4. <groupId>org.springframework.bootgroupId>
    5. <artifactId>spring-boot-maven-pluginartifactId>
    6. <configuration>
    7. <executable>trueexecutable>
    8. <layout>ZIPlayout>
    9. <includes>
    10. <include>
    11. <groupId>nothinggroupId>
    12. <artifactId>nothingartifactId>
    13. include>
    14. includes>
    15. configuration>
    16. plugin>
    17. <plugin>
    18. <groupId>org.apache.maven.pluginsgroupId>
    19. <artifactId>maven-dependency-pluginartifactId>
    20. <executions>
    21. <execution>
    22. <id>copyid>
    23. <phase>packagephase>
    24. <goals>
    25. <goal>copy-dependenciesgoal>
    26. goals>
    27. <configuration>
    28. <outputDirectory>
    29. ${project.build.directory}/lib
    30. outputDirectory>
    31. configuration>
    32. execution>
    33. executions>
    34. plugin>
    35. plugins>
    36. build>

     

    执行需要通过-Dloader.path指定lib的路径:

    java -Dloader.path=./lib -jar myProj-1.0.0.jar

    如果自己的项目里有自己的依赖需要,而且经常会更新,那就不能放在lib里了,lib里保证是放第三方jar包,不会去动版本的。

    那怎么做:spring-boot-maven-plugin 里的includes加需要包即可。

    1. <!--这里是填写需要包含进去的jar,如果没有则nothing -->
    2. <includes>
    3. <include>
    4. <groupId>com.jincou</groupId>
    5. <artifactId>xiaoxiao-util</artifactId>
    6. </include>
    7. </includes>

    缺点:多人项目难管理第三方jar,如果第三方jar包有人要更新,就有可能会忘记去服务器上更新。

    总结:

    • 普通项目用shade、assembly都行,我喜欢用shade。

    • springboot项目用spring-boot-maven-plugin。

    • 项目瘦身,提升部署效率,也是一项必须要会的技能。

  • 相关阅读:
    Python遍历列表时删除元素
    openpose 安装到简单实用 win11
    逻辑回归的数学推导
    高纯度高活性艾美捷人重组MEGACD40L蛋白(可溶性)
    云存储架构框架设计 | 最佳实践
    ping不通Linux服务器怎么办?
    算法基础:栈和队列
    Win10 系统下VisualStudio2019 配置Open3D-0.15.2(C++)
    人工智能知识全面讲解: 人脸识别技术
    【C语言】调试
  • 原文地址:https://blog.csdn.net/guo__hang/article/details/134557412