#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. Неудивительно, что это обеспечит соответствующее поведение. Актуальный вопрос в том, почему вы ожидаете другого поведения?