как jvm загружает разные jar-файлы, но с одинаковым именем пакета и именем класса?

#java #jvm

#java #jvm

Вопрос:

я озадачен двумя одинаковыми классами в разных банках, но проект демонстрирует разное поведение. например, как показано ниже :

jar: test1.jar класс: cn.oom.test.Приветственные тесты

   public class HelloTests {
   /**
    * greet
    *
    * @return
    */
   public static String greet(String greet) {
       System.out.println("test1 "   greet);
       return "test1"   greet;
   }
}
  

jar: test2.jar класс: cn.oom.test.Приветственные тесты

  public class HelloTests {
   /**
    * greet
    *
    * @return
    */
   public static String greet(String greet) {
       System.out.println("test2 "   greet);
       return "test2"   greet;
   }
}
  

в моем проекте (проект springboot): по крайней мере, я добавляю зависимость типа

 <dependency>
            <groupId>cn.oom.test1</groupId>
            <artifactId>test1</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>cn.oom.test2</groupId>
            <artifactId>test2</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
  

затем протестируйте класс следующим образом

 @Component
public class ATests implements CommandLineRunner {
    @Override
    public void run(String... args) throws Exception {
        HelloTests.greet("hello");
        //
    }
}
  

это показывает:

test1 привет

при импорте зависимости, например

 <dependency>
            <groupId>cn.oom.test2</groupId>
            <artifactId>test2</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>cn.oom.test1</groupId>
            <artifactId>test1</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
  

тот же код показывает :

test2 привет

что меня озадачивает: когда я упаковываю проект в виде файла jar, используйте java -jar atest.jar проект, который всегда показывает

test2 привет


  • почему такой результат?
  • разве jvm не загружает jar-файлы из порядка classpath по имени файла?
  • почему проект jar показывает то же самое, что и последовательность импорта зависимостей?(когда pom сначала импортирует test1, jar печатает test1, когда pom сначала импортирует test2, jar pirint test2 ) ?

Комментарии:

1. Как вы думаете, ваш фактический путь к классу?

2. меня смущает это, две jar-карты в classpath файла jar проекта (my: atest-0.0.1-SNAPSHOT.jarBOOT-INFlibtest1.jar [test2.jar ]) , зачем выводить другой результат? похоже, это связано с последовательностью зависимостей pom . но когда пакет отправляется в файл jar, почему он все еще имеет отношение?

3. Встроенный загрузчик классов не поддерживает загрузку классов из файлов jar, содержащихся в файлах jar. Итак, задействовано какое-то другое программное обеспечение. Программное обеспечение, которое настраивается вашей конфигурацией springboot. Неудивительно, что это обеспечит соответствующее поведение. Актуальный вопрос в том, почему вы ожидаете другого поведения?