提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


目标

我们本地的项目要通过打成Jar包进行发布或者供其他人使用。今天记录下利idea和maven完成项目的打包过程。


利用Idea+Maven我们可以打出以下三种不同的jar包:

  1. 不包含引入的依赖jar包
  2. 包含全部引入的依赖jar包
  3. 包含部分引入的依赖jar包

以一个简单的项目为例:

一、在本地创建一个Maven项目

创建项目时,我们可以选择创建maven项目。

标准的maven项目目录结构

二、编辑pom.xml文件和逻辑代码

  1. 如果我们要打不包含依赖的jar包
    此时,我们的pom.xml文件不用作特殊处理,只需要引入项目所需的jar包即可。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.chen</groupId>
    <artifactId>PinYinHelper</artifactId>
    <version>1.0-SNAPSHOT</version>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <!--引入项目依赖-->
    <dependencies>
        <dependency>
            <groupId>com.belerweb</groupId>
            <artifactId>pinyin4j</artifactId>
            <version>2.5.1</version>
        </dependency>
    </dependencies>
</project>


此时,我们直接使用右侧maven中的Lifecycle中的package指令打包即可,在package指令上双击:
双击package指令
此时经过maven的编译打包,即可在我们项目路径的target目录下生成不包含依赖的项目jar包。
打包完毕
此jar中不包含项目引入的依赖

  1. 如果我们要打包含依赖的jar包
    此时,我们的pom.xml文件中则要借助assembly插件完成
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.chen</groupId>
    <artifactId>PinYinHelper</artifactId>
    <version>1.0-SNAPSHOT</version>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>
            <!--借助assembly插件完成包含项目依赖的打包-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <appendAssemblyId>false</appendAssemblyId>
                    <descriptorRefs>
                        <!--设置将所有的依赖打进jar包中-->
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <!-- 此处指定main方法入口的class -->
                            <mainClass>com.chen.Application</mainClass>
                        </manifest>
                    </archive>
                    <!--指定打出的jar包输出目录-->
                    <outputDirectory>E:\IdeaWorkspace\PinYinHelper1\target</outputDirectory>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <!--将assembly插件绑定到package上,到时只需要双击package指令即可-->
                        <phase>package</phase>
                        <goals>
                            <goal>assembly</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    <!--引入项目依赖-->
    <dependencies>
        <dependency>
            <groupId>com.belerweb</groupId>
            <artifactId>pinyin4j</artifactId>
            <version>2.5.1</version>
        </dependency>
    </dependencies>
</project>

此时,我们同样双击右侧maven中的Lifecycle中的package指令,经过插件的编译打包,在我们设定的jar包输出目录中生成包含项目所有依赖的jar包。
包含项目依赖的打包
在这里插入图片描述

  1. 如果我们要打包含部分依赖的jar包
    比如说,想做一个工具jar包,依赖公共jar和自己本地jar包,本地jar包需要解压成class打到jar包内,而依赖的公共jar包则不需要。
    剔除公共jar包 可以用
    的值的含义:
    compile,缺省值,适用于所有阶段,会随着项目一起发布。
    provided,类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet.jar。
    runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段。
    test,只在测试时使用,用于编译和运行测试代码。不会随项目发布。
    system,类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。

例如:我们在项目依赖中增加junit的依赖,并在scope属性中设置为compile,然后将依赖打进项目包中:
重点看scope属性
在这里插入图片描述
可见,此时junit是被打进了jar包中的。

若我们将scope属性设置为test,在打包试试:
在这里插入图片描述

在这里插入图片描述
可见,此时junit是没有被打进jar包中的。

可执行jar包

如果我们在使用assembly插件打包时指定了程序的主入口类,则此时打出的jar包为可执行jar包,可以通过cmd命令行去执行我们的Jar包。命令为:Java -jar xxxx.jar.

在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐