在 Maven 中,主要有3个插件用来打包:
- maven-jar-plugin,默认的打包插件,得到普通的 Project JAR 包(主要用来依赖)
- maven-shade-plugin,打可执行JAR包,得到 Fat JAR 包(包含所有依赖)
- maven-assembly-plugin,支持自定义的打包结构和定制依赖项
Shade 插件的使用
- 插件:apache-maven-shade 的打包
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<configuration>
<!-- 避免生成reduced pom文件 -->
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
<executions>
<execution>
<!-- 插件把自己绑在 package 这一步,执行shade:shade("插件名":"goal名") 这个goal -->
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.howeres.observer.WeatherStation</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
-
idea 的非 spring 程序的 jar 打包:
- Artifacts -> add jar -> from modules with dependencies -> choose main class
- idea window choose the Build -> Build Artifacts… -> Build
-
查看 java 汇编指令:
javap -c -l XXX.class
- c:对代码进行反汇编
- l:查看行号
- 需要配好 Java 环境变量才能使用 javap
关于spring项目的打包
- 最好使用 maven 方式打包(可以查看我的另一篇关于maven生命周期的文章)。在使用 artifacts 方式打包会出现
错误: 找不到或无法加载主类 com.xx.xx.App
或者选用copy to the output directory and link via manifest
也就是Create JAR from Modules
第二项,这样out目录会有非常多jar包,但也容易出现问题 - spring 多模块项目打包时
- 需要在 root (父模块)下,进行 mvn package
- 在启动类所在的模块下,pom.xml 文件需要有
<build></build>
来包含打包插件,生成可执行jar