Я получаю java.lang.NoSuchMethodError
при попытке вызвать метод Java. Насколько я могу судить, путь к классам идентичен во время компиляции и времени выполнения, поэтому этой ошибки возникать не должно.
Шаги воспроизведения:
Создайте 4 проекта Maven:
- MyLibrary
- ExtensionPresent
- Расширение отсутствует
- UserCode
Модули
ExtensionPresent
иExtensionMissing
экспортируют одно и то же имя модуля.ExtensionMissing
экспорт:
package dummy;
public class Extension {}
ExtensionPresent
экспорт:
package dummy;
public class Extension {
public static void present() {
System.out.println("Extension present!");
}
}
MyLibrary
объявляетExtensionMissing
как зависимость.UserCode
объявляетMyLibrary
как зависимость.UserCode.main()
вызываетExtension.present()
. Это вызывает ошибку времени компиляции, потому чтоExtensionMissing
не содержит этого метода.- Теперь самое интересное ... В проекте
UserCode
добавьтеExtensionPresent
в качестве зависимости послеMyLibrary
. - Я больше не получаю ошибку компилятора (теперь метод присутствует во время компиляции).
- Когда я пытаюсь вызвать
UserCode.main()
, я получаю:
--- exec-maven-plugin:1.6.0:exec (default-cli) @ mavenproject3 ---
Exception in thread "main" java.lang.NoSuchMethodError: dummy.Extension.present()V
Это ошибка конфигурации моего проекта, реализации Maven или инструментов JDK?
(Кстати, я делаю это в попытке решить: Реализация архитектуры плагина (во время компиляции) без разделенных пакетов < / а>)
ОБНОВЛЕНИЕ: это исполняемый тестовый пример: https://github.com/cowwoc/exec-maven-plugin-class-shadowing
exports
противоречит соглашению Java9 в вопросе. - person Naman   schedule 05.12.2017javac
(во время компиляции) иjava
(во время выполнения), не могли бы вы обновить их вопрос, пожалуйста? Просто чтобы убедиться, что это не дубликат Java 9: в пути к модулю может быть 2 модуля с одинаковыми именами - person Naman   schedule 05.12.2017mvn dependency:tree
, чтобы получить эффективный список используемых зависимостей. Кроме того, отличается ли ваше поведение при вызовеUserCode
из командной строкиjava -jar ...
? - person scrutari   schedule 05.12.2017mvn dependency:tree
возвращает ожидаемый результат. Запуск проекта с использованиемjava -cp ...
отлично работает, если я поменял местами зависимостиExtensionPresent
,ExtensionMissing
. - person Gili   schedule 06.12.2017ExtensionPresent
иExtensionMissing
меняется между компилятором и плагином exec. Плагин компилятора делает это правильно. Плагин exec перечисляет их в неправильном порядке. Если я вызываюjava
вручную с замененными зависимостями, программа работает нормально. Я только что обновил вопрос ссылкой на исполняемый тестовый пример. Пожалуйста, попробуйте. - person Gili   schedule 06.12.2017mvn clean install
в вашем клонированном тестовом примере также не выполняется. Ошибка компиляции[ERROR] ../exec-maven-plugin-class-shadowing/UserCode/src/main/java/testcase/Main.java:[8,18] cannot find symbol [ERROR] symbol: method present() [ERROR] location: class extension.Extension
- person Naman   schedule 06.12.2017good.txt
иbad.txt
? Это журналы сборки в двух разных каталогах. Я вижу, чтоmaven-compiler-plugin
использует неправильный порядок зависимостей вbad.txt
, но я не могу понять, почему изменение каталога привело бы к этому. - person Gili   schedule 06.12.2017maven-compiler-plugin
поступает неправильно во всех каталогах, кроме упомянутого вgood.txt
, но независимо ... Согласно stackoverflow.com/a/793193/14731 все плагины Maven должны учитывать порядок путей к классам, как указано вpom.xml
. Они не. Звучит как ошибка, не так ли? - person Gili   schedule 06.12.2017HashMap
). Кроме того, теперь это подтвержденная ошибка. См. issues.apache.org/jira/browse/ - person Gili   schedule 07.12.2017