同福

SpringBoot项目打包成jar库包文件给其他项目使用的方法

介绍

介绍

福哥打算做一个tfjava项目,把通用的公共库整合到一起,打包成jar库包给其他项目使用。现在把操作过程记录下来,分享给大家~~

打包

打包可以通过IDE工具直接生成,也可以通过Maven命令生成,下面福哥将两种方法都介绍给大家

打包插件

在pom.xml里将默认的spring-boot-maven-plugin插件改成maven-compiler-plugin插件

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
</plugin>

库包信息

在pom.xml里的project节点下面设置 groupId,artifactId,version 信息

<groupId>net.tongfu</groupId>
<artifactId>tfjava</artifactId>
<version>1.0.1.BETA</version>

IDE生成

生成jar库包到本地的maven库里,点击IDEA右侧的Maven按钮,在Maven窗口里点开 [项目名称] > Lifecycle > install,双击这个“install”开始生成jar库包

a00961000cbd0d16.jpg

一切顺利的话,jar库包会被生成到项目的 target 下面,使用这个jar库包除了jar文件还需要项目的pom.xml文件。

6badfb42ed20cc93.jpg

Maven生成

如果需要自动化生成jar库包可以使用maven命令行生成,可以通过install直接生成jar包文件并且自动部署到本地maven库里,也可以先通过package生成jar包然后通过install:install-file导入本地maven库,导入本地maven库需要提供包信息,包括groupId、artifactId、version和jar包文件路径

自动部署

自动生成jar包文件,自动导入本地maven库

mvn clean install -Dmaven.test.skip=true

手动部署

生成jar包文件

mvn clean package -Dmaven.test.skip=true

导入jar包到本地maven库

mvn install:install-file -DgroupId=[groupId] -DartifactId=[artifactId] -Dversion=[version] -Dfile=[jar包完整路径]

Jar包位置

生成jar包在项目根目录下面的 target 文件夹下

引用

引用生成出来的jar包有三种方法,将jar包导入本地maven库使用,将jar包导入远程maven库使用,将jar包复制到项目下面包含使用,福哥分别将这三种方法介绍给大家

本地Maven库

如果是在打包项目所在的电脑上开发新项目,那么就可以在新项目里直接使用这个库包里面的对象,因为我们已经将jar包导入到了本地maven库了

远程Maven库

如果是在其他电脑上开发新项目,那么就需要把jar文件和pom.xml文件按要求复制到远程电脑上,然后通过mvn命令将jar库包导入的maven库里

复制target下面的生成的jar包到其他电脑上,在其他电脑上运行如下命令导入jar包到本地maven库

mvn install:install-file -DgroupId=net.tongfu -DartifactId=tfjava -Dversion=1.0.1.BETA -Dpackaging=jar -Dfile=[jar包完整路径]

项目包含

除了将jar包导入到本地maven库之外,还可以把jar包复制到项目下面,通过包含的方式引入到项目里面。这种方式无需对本地maven库进行任何调整,推荐使用这种方法

在pom.xml里面将tfjava的依赖项设置改动一下,增加systemPath参数指定jar包路径

<dependency>
    <groupId>net.tongfu</groupId>
    <artifactId>tfjava</artifactId>
    <version>1.0.1.BETA</version>
    <scope>system</scope>
    <systemPath>${basedir}/lib/tfjava-1.0.1.BETA.jar</systemPath>
</dependency>

在项目根目录增加 lib 文件夹,复制tfjava的jar包到这个文件夹下面,然后再编译项目就可以通过了

ebdbe47c6f7590d0.jpg

带依赖项打包

如果我们开发的jar包依赖其他jar包,直接使用上面的方法打包后在远程电脑上使用的时候,如果远程电脑上没有依赖jar包就会出现问题

要解决这个问题需要在打包的时候将依赖项信息添加到生成的jar包里面,在远程电脑上导入的时候自动下载它们,才能正常使用

可用缩使用assembly插件打包依赖jar包,或者通过maven命令打包依赖jar包(也是使用assembly插件)

Assembly插件

在pom.xml添加assembly插件,提供它来解决依赖项的问题

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>
</plugin>

Maven生成

使用maven命令行生成包含依赖项的jar包,命令基本和不包含依赖项的打包方式一样,就是一个区别,把package或者install换成assembly:single

打包

使用assembly:single打包

mvn assembly:single -Dmaven.test.skip=true

生成

可以看到在target下面生成了两个jar包,一个tfjava-1.0.1.BETA.jar不包括,另一个tfjava-1.0.1.BETA-jar-with-dependencies.jar包括全部依赖项的jar包

排除依赖项打包

如果有一些jar包仅用于测试,或者属于公共jar包,在打包的时候不想打包到项目里,可以通过scope设置为不需要打包,从而在生成的jar包排除这些jar包依赖项

scope

在dependency里通过scope来指明这个依赖性是使用范围,可选择说明如下:

  • compile:(默认)依赖性会被打包到生成的项目里 

  • provided:期待JDK、容器或使用者会提供这个依赖

  • runtime:只在运行时使用,如JDBC驱动,适用运行和测试阶段

  • test:只在测试时使用,用于编译和运行测试代码,不会被打包到生成的项目里

  • system:需要显式提供包含依赖的jar,maven不会在repository中查找它

原则

给dependency设置scope有下面几个原则,可以参考

  • 系统级别的jar包可以使用provided,一般情况下使用者会满足这些jar包环境