Мультимодуль Maven затеняет один модуль перед его использованием в другом модуле

У меня есть многомодульная сборка Maven, в которой один модуль затеняет библиотеку, а другой модуль использует общую библиотеку.

Если я запустил mvn test, это приведет к package com.example.shaded.javax.el7 does not exist.

Если я запустил mvn package test, компиляция и тесты пройдут.

Итак, я бы хотел, чтобы затененный модуль не просто компилировался, но был затенен (упакован) при запуске maven-shade-plugin:3.2.1:shade перед компиляцией зависимого модуля.

Можно ли ввести такую ​​целевую зависимость в maven в pom.xml?

При привязке плагина тени к фазам, отличным от пакета, появляется следующее сообщение об ошибке:

[ERROR] The project main artifact does not exist. This could have the following
[ERROR] reasons:
[ERROR] - You have invoked the goal directly from the command line. This is not
[ERROR]   supported. Please add the goal to the default lifecycle via an
[ERROR]   <execution> element in your POM and use "mvn package" to have it run.
[ERROR] - You have bound the goal to a lifecycle phase before "package". Please
[ERROR]   remove this binding from your POM such that the goal will be run in
[ERROR]   the proper phase.


person tkruse    schedule 02.04.2019    source источник
comment
Почему вы упомянули gradle в последнем предложении?   -  person Aaron Digulla    schedule 02.04.2019


Ответы (1)


Обновить Похоже, нет простого способа сделать это.

Вставьте между ними новый модуль Maven, который выполняет затенение. Присоедините shade к фазе test в этом модуле. Не забывайте полагаться на новый модуль.

Код для mvn test не работает, потому что он не создает никаких JAR и, следовательно, не вызывает плагин Shade.

У вас может возникнуть соблазн изменить фазу запуска Shade на generate-test-resources или test в существующем модуле, но это может вызвать другие проблемы, если что-то произойдет на более поздних этапах Жизненный цикл Maven. Вот почему я предлагаю создать новый модуль, в котором у вас не будет других побочных эффектов.

person Aaron Digulla    schedule 02.04.2019
comment
Я отредактировал вопрос, решение, которое вы предлагаете, похоже, не позволяет плагину тени. - person tkruse; 03.04.2019
comment
Я думаю, что с mvn test происходит что-то странное, потому что он не создает JAR. Так что мне интересно, что находится в пути к классам для следующего модуля. Maven, вероятно, в этом случае добавит папку target/classes/. - person Aaron Digulla; 03.04.2019
comment
Можете попробовать превратить тест в интеграционный? См. stackoverflow.com/questions/1399240/ - person Aaron Digulla; 03.04.2019
comment
Хм ... Это очень неправильно. Возможно, это возможно, но я думаю, что правильный ответ на мой вопрос будет: это невозможно. Так что я бы предпочел сделать затенение по-другому. - person tkruse; 05.04.2019