首先從表現層介紹,後續後深入原理。 1,先簡單介紹maven如何生成jar文件方便測試 2.自定義兩個jar包,其中包含相同包名和類名 與export的導入順序有關。只會載入第一個,並且運行正常。 3.自定義jar和jdk包, 其中包含相同的包名和類名 與export的導入順序有關。同樣是只會載入第 ...
首先從表現層介紹,後續後深入原理。
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:assembly2.自定義兩個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