下面小編就為大家帶來一篇淺談兩個jar包中包含完全相同的包名和類名的加載問題。小編覺得蠻不錯的,現在就分享給大家,也給大家做個參考。一起跟著小編過來看看吧
先從表現層介紹,後續後再深入原理。
1、先簡單介紹maven如何產生jar檔案方便測試
<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> 配置了一个manifest标签来配置Main函数的入口。然后通过如下指令来实现打包。 mvn assembly:assembly
2、自訂兩個jar包,其中包含相同包名和類別名
與export的導入順序有關。只會載入第一個,並且運作正常。
3、自訂jar和jdk包, 其中包含相同的套件名稱和類別名稱
與export的導入順序有關。同樣是只會載入第一個,但是如果載入自訂的jar運作會報錯。加載 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
以上是兩個jar包中包含完全相同的包名和類別名的載入問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!