以下のエディターは、まったく同じパッケージ名とクラス名を含む 2 つの 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. 同じパッケージ名とクラス名を含む 2 つの jar パッケージをカスタマイズします
輸出量は注文により異なります。最初のものだけがロードされ、正常に実行されます。
3. 同じパッケージ名とクラス名を含むカスタム jar および jdk パッケージ
これは、エクスポートのインポート順序に関係します。同様に、最初のものだけがロードされますが、カスタム 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 依存関係: 分析、mvn 依存関係: ツリー
以上が2 つの jar パッケージにまったく同じパッケージ名とクラス名が含まれている場合の読み込みの問題の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。