淺談兩個(gè)jar包中包含完全相同的包名和類(lèi)名的加載問(wèn)題
首先從表現(xiàn)層介紹,后續(xù)后深入原理。
1、先簡(jiǎn)單介紹maven如何生成jar文件方便測(cè)試
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>Main.Main</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
配置了一個(gè)manifest標(biāo)簽來(lái)配置Main函數(shù)的入口。然后通過(guò)如下指令來(lái)實(shí)現(xiàn)打包。
mvn assembly:assembly
2、自定義兩個(gè)jar包,其中包含相同包名和類(lèi)名
與export的導(dǎo)入順序有關(guān)。只會(huì)加載第一個(gè),并且運(yùn)行正常。
3、自定義jar和jdk包, 其中包含相同的包名和類(lèi)名
與export的導(dǎo)入順序有關(guān)。同樣是只會(huì)加載第一個(gè),但是如果加載自定義的jar運(yùn)行會(huì)報(bào)錯(cuò)。加載 jdk正常。
protected Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
synchronized (getClassLoadingLock(name)) {
// First, check if the class has already been loaded
Class<?> c = findLoadedClass(name);
if (c == null) {
long t0 = System.nanoTime();
try {
if (parent != null) {
c = parent.loadClass(name, false);
} else {
c = findBootstrapClassOrNull(name);
}
} catch (ClassNotFoundException e) {
// ClassNotFoundException thrown if class not found
// from the non-null parent class loader
}
if (c == null) {
// If still not found, then invoke findClass in order
// to find the class.
long t1 = System.nanoTime();
c = findClass(name);
// this is the defining class loader; record the stats
sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
sun.misc.PerfCounter.getFindClasses().increment();
}
}
if (resolve) {
resolveClass(c);
}
return c;
}
}
4、mvn jar包沖突常用命令
mvn dependency:analyze,mvn dependency:tree
以上這篇淺談兩個(gè)jar包中包含完全相同的包名和類(lèi)名的加載問(wèn)題就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用SpringBoot簡(jiǎn)單實(shí)現(xiàn)無(wú)感知的刷新 Token功能
實(shí)現(xiàn)無(wú)感知的刷新 Token 是一種提升用戶體驗(yàn)的常用技術(shù),可以在用戶使用應(yīng)用時(shí)自動(dòng)更新 Token,無(wú)需用戶手動(dòng)干預(yù),這種技術(shù)在需要長(zhǎng)時(shí)間保持用戶登錄狀態(tài)的應(yīng)用中非常有用,以下是使用Spring Boot實(shí)現(xiàn)無(wú)感知刷新Token的一個(gè)場(chǎng)景案例和相應(yīng)的示例代碼2024-09-09
Java 獲取當(dāng)前類(lèi)名和方法名的實(shí)現(xiàn)方法
這篇文章主要介紹了 Java 獲取當(dāng)前類(lèi)名和方法名的實(shí)現(xiàn)方法的相關(guān)資料,這里不僅提供了實(shí)現(xiàn)方法并比較幾種方法的效率,需要的朋友可以參考下2017-07-07
Spring MVC的優(yōu)點(diǎn)與核心接口_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Spring MVC的優(yōu)點(diǎn)與核心接口,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08
java高并發(fā)下解決AtomicLong性能瓶頸方案LongAdder
這篇文章主要為大家介紹了java高并發(fā)下解決AtomicLong性能瓶頸方案LongAdder,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
Java8 String內(nèi)存優(yōu)化之字符串常量池詳解
這篇文章主要介紹了Java8 String內(nèi)存優(yōu)化之字符串常量池,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,2023-07-07
詳解OpenCV For Java環(huán)境搭建與功能演示
這篇文章主要介紹了x詳解OpenCV For Java環(huán)境搭建與功能演示,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
java運(yùn)行jar包提示?“XXX中沒(méi)有主清單屬性”?"找不到主類(lèi)”兩種解決辦法
本文主要介紹了java運(yùn)行jar包提示?“XXX中沒(méi)有主清單屬性”?"找不到主類(lèi)”兩種解決辦法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
從Mybatis-Plus開(kāi)始認(rèn)識(shí)SerializedLambda的詳細(xì)過(guò)程
這篇文章主要介紹了從Mybatis-Plus開(kāi)始認(rèn)識(shí)SerializedLambda,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07

