Maven

maven:jar、dependency打包插件简记

2020-04-16  本文已影响0人  末池桑

因为运维要求,最近项目中需要将部署规范化,涉及到了使用 Maven 的打包插件对项目进行重新规范化打包,这里对 Maven 的几个打包插件:maven-jar / dependency / assembly-plugin 做个总结和简记,方便日后用到时及时翻阅和回顾。

Java 包基本概念

Maven 打包的几种方式

默认情况下,使用 mvn package 只会把项目自身的 class 文件打成 jar 包,并不包括工程依赖的其他 jar ,而且打出的也是普通 jar ,往往就是给其他工程做引用而打的 Jar 包。如果想要打出一个可执行的 jar 包,就需要在 pom 中 <build> 标签下做打包插件配置,配置 maven-jar-plugin ,其配置如下:

maven-jar-plugin

<!-- Maven 打可执行 jar包 配置-->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <!-- 指定启动主类(Main-Class)-->
                <mainClass>com.com.chifuyong.TestDemo</mainClass>
                <!-- 在 MANIFEST.MF 加上 Class-Path 项并配置依赖包 -->
                <addClasspath>true</addClasspath>
                <!-- 指定依赖包所在目录 -->
                <classpathPrefix>dependencies/</classpathPrefix>
            </manifest>
        </archive>
    </configuration>
</plugin>

mainClass 可以设置主类,就是程序的入口类,java -jar 时就是以这个类为入口;addClasspath 表示增加工程所依赖 jar 包的 class-path 路径,设为 true ;classpathPrefix 就是工程依赖 jar class-path 的相对根路径,设为 dependencies ,执行 mvn package 打完包后的,解压 jar 包,其中 MANIFEST.MF 文件部分内容如下图:

TestDemo 入口类如下,调用了 DruidDataSource 这个类,依赖于 druid-1.0.9.jar 这个包

此时做这个配置时,虽然打包打出来的是可执行 jar ,但是并没有把工程所依赖的 jar 包都打进去,java -jar 运行这个 jar 时肯定会因找不到类而报 ClassNotFoundException ,如下:

这就需要配合 maven-dependency-plugin 的使用,来将工程所依赖的 jar 包复制到相应的目录,也就是上面 maven-jar-plugin 配置中的 classpathPrefix(dependencies),配置如下:

maven-dependency-plugin

<!-- 可执行jar 相关依赖目录存放配置 -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <!-- 依赖的jar包输出目录 -->
                <outputDirectory>${project.build.directory}/dependencies</outputDirectory>
                <!-- 排除 provide 范围-->
<!--                            <excludeScope>provided</excludeScope>-->
                <!-- 只包含 runtime -->
                <includeScope>runtime</includeScope>
                <useBaseVersion>true</useBaseVersion>
            </configuration>
        </execution>
    </executions>
</plugin>

phase 设置为 package ,goal 设置为 copy-dependencies ,表示在 Maven 的生命周期 package 阶段,会执行 maven-dependency-plugin 插件的 copy-dependencies 功能,也就是当 Maven 执行到 package 时会把工程所依赖的 jar 包复制到某个目录,outputDirectory 设置的就是这个目录,excludeScope 就是排除相应的 scope,排除不需要打包的 scope,而 includeScope 则相反;mvn package 打完包后结果如下,${project.build.directory} 也就是 Maven(约定大于配置理念)约定好了的编译目录 target ,结构如下图:

这个时候只需要将 jar 包和 dependencies 目录(里面有工程所依赖的 jar 包)放在同个目录下,之后,之后不管放哪里,java -jar 都不会再报 找不到类,如下:

其他

具体的演示代码 GitHub 地址 > 点击这里

还要更强大的打包插件 maven-assembly-plugin,请看这里 > maven:assembly打包插件简记

上一篇 下一篇

猜你喜欢

热点阅读