偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

記一次 Maven 打包后,第三方無法使用的排查記錄

開發(fā) 架構(gòu)
本篇既然涉及到 Maven,這里先總結(jié)下 Maven 的常用命令。對(duì) Maven 命令比較熟悉的同學(xué)可以跳過這小節(jié)。

你好,我是悟空。

本文主要內(nèi)容如下:

圖片

目錄

前言

最近遇到一個(gè)需求:

寫一個(gè)工具類的 JAR 包,然后提供給第三方調(diào)用其中的類方法。(前提:第三方無法共用我們項(xiàng)目的私有倉庫)

期間遇到了一些問題:

  • 第三方引入 JAR 包后,無法import。
  • 第三方引入 JAR 包后,缺少 JAR 包中的其他依賴。

本篇做個(gè)記錄,希望能幫助到其他小伙伴。

本篇既然涉及到 Maven,這里先總結(jié)下 Maven 的常用命令。對(duì) Maven 命令比較熟悉的同學(xué)可以跳過這小節(jié)。

一、Maven 常見命令

當(dāng)我們創(chuàng)建好一個(gè) Maven 工程時(shí),IDEA 開發(fā)工具的右側(cè)就會(huì)自動(dòng)出現(xiàn) Maven 命令。

圖片

Maven 操作

我們用鼠標(biāo)雙擊下就可以運(yùn)行了,也可以通過命令行來執(zhí)行

圖片

下面介紹這幾種命令的區(qū)別。

clean(常用)

刪除項(xiàng)目路徑下的 target 文件,但是不會(huì)刪除本地的maven倉庫已經(jīng)生成的 JAR 文件。

圖片

validate

驗(yàn)證工程正確性,所需信息是否完整。

compile

編譯。會(huì)在你的項(xiàng)目路徑下生成一個(gè)target目錄,在該目錄中包含一個(gè)classes文件夾,里面全是生成的class文件。

test

執(zhí)行單元測(cè)試。

package(常用)

將工程文件打包為指定的格式,例如 JAR,WAR 等(看你項(xiàng)目的 pom文件,里面packaging 標(biāo)簽就是來指定打包類型的)。

這個(gè)命令會(huì)在你的項(xiàng)目路徑下一個(gè)target目錄,并且擁有compile命令的功能進(jìn)行編譯,同時(shí)會(huì)在target目錄下生成項(xiàng)目的 jar/war文件。

圖片

如果a項(xiàng)目依賴于b項(xiàng)目,打包b項(xiàng)目時(shí),只會(huì)打包到b項(xiàng)目下target下,編譯a項(xiàng)目時(shí)就會(huì)報(bào)錯(cuò),因?yàn)檎也坏剿蕾嚨腷項(xiàng)目,說明a項(xiàng)目在本地倉庫是沒有找到它所依賴的b項(xiàng)目,這時(shí)就用到 install 命令。

verify

核實(shí),主要是對(duì) package 檢查是否有效、符合標(biāo)準(zhǔn)。

install(常用)

將包安裝至本地倉庫,以讓其它項(xiàng)目依賴。

該命令包含了 package 命令功能,不但會(huì)在項(xiàng)目路徑下生成 class 文件和 jar 包,同時(shí)會(huì)在你的本地maven倉庫生成 jar 文件,供其他項(xiàng)目使用(如果沒有設(shè)置過maven本地倉庫,一般在用戶 /.m2 目錄下。如果 a 項(xiàng)目依賴于 b 項(xiàng)目,那么 install b 項(xiàng)目時(shí),會(huì)在本地倉庫同時(shí)生成 pom 文件和 jar文件,解決了上面打包 package出錯(cuò)的問題)。

圖片

build

建造。功能類似compile,區(qū)別是對(duì)整個(gè)項(xiàng)目進(jìn)行編譯。

與 compile區(qū)別及特點(diǎn):是對(duì)整個(gè)工程進(jìn)行徹底的重新編譯,而不管是否已經(jīng)編譯過。

Build過程往往會(huì)生成發(fā)布包,這個(gè)具體要看對(duì) IDE 的配置了,Build在實(shí)際中應(yīng)用很少,因?yàn)殚_發(fā)時(shí)候基本上不用,發(fā)布生產(chǎn)時(shí)候一般都用ANT等工具來發(fā)布。Build 因?yàn)橐烤幾g,還要執(zhí)行打包等額外工 作,因此時(shí)間較長(zhǎng)。

site

生成項(xiàng)目的站點(diǎn)文檔。

deploy(常用)

部署。將 jar 包部署到遠(yuǎn)程倉庫,通常是私有倉庫。而且包含了 install 命令的功能。

二、打包后,無法 import?

下面介紹一下我用常規(guī)打包方式遇到的問題。

我通過 IDEA 工具創(chuàng)建了一個(gè) SpringBoot 項(xiàng)目,然后 pom.xml 文件中會(huì)自動(dòng)引入一個(gè)打包插件,如下圖所示:

圖片

然后我執(zhí)行 maven package 命令,會(huì)在項(xiàng)目的 target 目錄生成一個(gè) JAR 包。如下圖所示:

圖片

然后我做了以下事情:

把這個(gè) JAR 包拷貝出來,發(fā)給了第三方。

讓第三方拷貝到他們自己的本地項(xiàng)目中。這里是在項(xiàng)目的根目錄創(chuàng)建了一個(gè) libs 目錄,然后將 jar 包放到 libs 目錄中。

圖片

讓第三方在 pom 依賴中引入這個(gè)依賴包。

圖片

scope 指定為 system,表示引入指定路徑(systemPath配置)下的 JAR 包。

看起來這么做沒問題了,但是當(dāng)我們 import 這個(gè) JAR 包下的類時(shí),就會(huì)報(bào)錯(cuò)。如下圖所示:

圖片

很奇怪,這里為什么會(huì)報(bào)錯(cuò)呢??

先看下這個(gè) JAR 包是否引入了。如下所示,可以看到確實(shí)是正確引入了,沒有報(bào)錯(cuò)。

圖片

通過 research,發(fā)現(xiàn)這個(gè)打包插件打出來的 JAR 包,是供執(zhí)行的,也就是可以通過 java -jar 命令來運(yùn)行這個(gè) JAR 包,并不能給第三方來引用使用。

解決方案:換一個(gè)打包插件 maven-compiler-plugin。

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>

再次打包發(fā)給第三方,發(fā)現(xiàn) import 不報(bào)錯(cuò)了。

但是又報(bào)另外一個(gè)錯(cuò),我們接著往下看。

三、缺少其他 Jar 包依賴?

報(bào)錯(cuò)信息如下:

java.lang.NoClassDefFoundError: org/apache/commons/codec/binary/Base64

通過這個(gè)信息,可以想到是不是我提供的 JAR 包中引入了這個(gè) commons-codec 依賴,而 JAR 包文件中又不包含這個(gè)依賴。

看下這個(gè) JAR 文件的大小,只有 14 KB, 而 commons-codec 的包大小為 339 KB,說明這個(gè) JAR 包確實(shí)不包含 common-codec 依賴。

圖片

解決方案:

將其他依賴包打入到這個(gè) JAR 包里面(推薦)。

第三方自己引入其他依賴包。(麻煩了第三方,要第三方一個(gè)個(gè)引入)

那如何將依賴的包打進(jìn)這個(gè) JAR 包里面呢?

這里還要引入一個(gè)打包插件:maven-assembly-plugin,如下所示。(省略了部分標(biāo)簽)

<!--添加依賴 maven-assembly-plugin -->
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.0.0</version>
</dependency>

<!--添加插件 maven-assembly-plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4.1</version>
<configuration>
<!--打包時(shí),包含所有依賴的jar包-->
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>

然后還要用插件打包的方式:assembly:assembly

圖片

然后target目錄下會(huì)多出一個(gè)包,帶了一個(gè)后綴:jar-with-dependencies

decryption-0.0.1-SNAPSHOT-jar-with-dependencies.jar

這個(gè)包的文件的大小比較大,有 15.4 M。

發(fā)給第三方再次引入后,不再報(bào)錯(cuò)了。

圖片

我們來看下這個(gè)包里面有什么東西,在 META-INF/maven 目錄下可以看到 commons-codec 依賴包,說明確實(shí)將這個(gè)依賴包打進(jìn)去了。

圖片

而之前打的包,是沒有這個(gè)目錄的。

圖片

至此,排查結(jié)束。

參考資料:

??https://blog.csdn.net/Shangxingya/article/details/114810454??

??https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html??

關(guān)于我

8 年互聯(lián)網(wǎng)開發(fā)經(jīng)驗(yàn),擅長(zhǎng)微服務(wù)、分布式、架構(gòu)設(shè)計(jì)。目前在一家大型上市公司從事基礎(chǔ)架構(gòu)和性能優(yōu)化工作。

InfoQ 簽約作者、藍(lán)橋簽約作者、阿里云專家博主、51CTO 紅人。

責(zé)任編輯:武曉燕 來源: 悟空聊架構(gòu)
相關(guān)推薦

2015-11-05 16:44:37

第三方登陸android源碼

2022-10-24 07:32:20

Mavenjar包代碼

2017-12-11 15:53:56

2010-05-25 11:09:31

SVN工具

2014-07-22 10:56:45

Android Stu第三方類庫

2014-07-23 08:55:42

iOSFMDB

2019-07-30 11:35:54

AndroidRetrofit

2022-11-16 08:00:00

雪花算法原理

2013-08-14 09:50:32

iOS類庫

2014-08-13 10:27:23

CocoaPods

2013-12-24 16:58:28

搜狐

2019-03-15 16:20:45

MySQL死鎖排查命令

2014-07-25 09:33:22

2021-05-13 08:51:20

GC問題排查

2009-12-31 14:38:34

Silverlight

2016-10-21 14:09:10

2023-04-06 07:53:56

Redis連接問題K8s

2017-05-16 13:24:02

LinuxCentOS第三方倉庫

2019-09-03 18:31:19

第三方支付電商支付行業(yè)

2021-08-08 11:29:04

Android第三方ROM調(diào)查
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)