Подтвердить что ты не робот

Как возможно, что Maven строит классы, которых нет в моем проекте?

Сегодня я вижу чрезвычайно странную проблему с Maven: она пытается создать классы, которые не входят в мой проект, но поступают из зависимостей. mvn compile сбой:

...
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] AppConstants.java):[4,12] unmappable character for encoding UTF-8
...

В моем проекте нет AppConstants.java, а поиск с grep -r AppConstants . не дает результатов. Класс существует в другом артефакте, который зависит от моего проекта.

Мне удалось собрать мой проект, передав -Dproject.build.sourceEncoding=Cp1252 в mvn compile, но это не решение, потому что в моем проекте должна использоваться кодировка utf-8. Разумеется, при компиляции таким образом я вижу AppConstants.class под target/classes/, но откуда он может исходить? Как это возможно?

Недавно ничего не изменилось в помпе проекта, но я знаю, что зависимый проект работает над переходом на Maven в эти дни. Что может быть?

UPDATE

В моем проекте нет файла AppConstants.java, а AppConstants не упоминается нигде внутри проекта:

$ grep -ri AppConstants .         # finds nothing
$ find . | grep -i AppConstants   # finds nothing

Этот AppConstants существует в другом проекте, от которого зависит мое действие. У меня нет исходного кода этого другого проекта на моем ПК. Мои товарищи по команде могут воспроизвести эту проблему, это не относится к моему компьютеру. В последнее время наша поместья не изменилась, но мы знаем, что в последнее время жребий другой команды сильно меняется.

В моем проекте есть один класс, который использует класс SomeOther из другого проекта. Если я создаю с помощью -Dproject.build.sourceEncoding=Cp1252, то сборка работает, а в моей папке target я вижу SomeOther.class, AppConstants.class и несколько других кланов из другого сгенерированного проекта. Если я удалю из моего проекта класс, который использует SomeOther, то я могу нормально построить, хотя проект не будет работать, так как ему нужны эти другие классы.

@Gus: Зная, что это в SomeOther, можете ли вы создать общедоступный образец проекта, который проявляет такое же поведение? В противном случае опишите иерархию, и где вы используете mvn compile из... у вас есть многомодульный проект, и вы строите подпроект?

Слишком сложно создать общедоступный образец. Мой проект является многомодульным, когда я запускаю mvn compile вверху, он терпит неудачу в подмодуле, поэтому для более быстрой итерации я вместо этого запускаю в подмодуле. Результат тот же, но быстрее. Но вы заставили меня подумать: я проверю, генерируют ли наши сборки файлы .class для других проектов в других подмодулях.

Общий код и полный pom

Это работает, поэтому я не могу поделиться полным кодом и помпой, к сожалению. Я могу включить анонимные фрагменты, если вы запрашиваете определенные разделы.

4b9b3361

Ответ 1

Выяснилось: другая команда ошибочно поместила файлы .java в их артефакт jar вместо .class файлов.

Итак, по-видимому, когда Maven не находит скомпилированные классы, но находит исходный код, то он строит классы локально из этого исходного кода. Это довольно умно, и теперь все имеет смысл.

После того, как другая команда зафиксировала свои баночки, и мы обновили наши тайники артефактов Maven, сборка снова работает, используя нашу кодировку utf-8 и никаких хакерских обходных решений, мы вернулись к здравомыслию.

@andyf, @khmarbaise, @PavelHoral, @Gus, спасибо вам, ребята, за вашу помощь!