美文网首页Maven
maven:jar、dependency打包插件简记

maven:jar、dependency打包插件简记

作者: 末池桑 | 来源:发表于2020-04-16 20:22 被阅读0次

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

    Java 包基本概念

    • 普通 jar 包
      都是作为类库,作为给其他工程提供依赖而打出的 jar 包,Maven 中 pom.xml 文件添加的 dependency 都算是普通的 jar 包。

    • 可执行 jar 包
      即 java -jar 命令就可运行的 jar 包,打包时需要设置入口类等信息。

    • war 包
      Java Web应用包,包含所有程序类、配置文件、jsp、js等资源文件,放到 Tomcat 的 webapps 下启动 Tomcat 即可部署 web 服务。

    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打包插件简记

    相关文章

      网友评论

        本文标题:maven:jar、dependency打包插件简记

        本文链接:https://www.haomeiwen.com/subject/yvztvhtx.html