Tenho lutado para entender qual fase do ciclo de vida padrão realmente transfere minhas dependências remotas do meu pom.xml para minha pasta .m2 local.
Pelo que entendi, ele mvn dependency:resolve
usa o plug-in de dependência maven para eliminar quaisquer dependências remotas necessárias. De acordo com esta documentação, ele deveria estar vinculado à fase de geração de fontes.
No entanto, se eu executar mvn generate-sources
, o maven não parece executar a resolução de dependência.
Suponho que isso ocorre porque o plugin de dependência maven não é executado por padrão, a menos que seja explicitamente especificado em meu pom?
De qualquer forma, parece que só conseguirei atingir essa etapa de resolução se executar mvn compile
o que mostra minhas dependências remotas sendo retiradas em algum tipo de pré-etapa colocada antes da execução do plug-in de recursos e do plug-in do compilador.
└[~/IdeaProjects/youtube-spring-reactive-programming]> mvn compile
[INFO] Scanning for projects...
[INFO]
[INFO] ---------------< com.javatechie:springboot-webflux-demo >---------------
[INFO] Building springboot-webflux-demo 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
Downloading from central: https://repo.maven.apache.org/maven2/org/projectlombok/lombok/1.18.22/lombok-1.18.22.pom
Downloaded from central: https://repo.maven.apache.org/maven2/org/projectlombok/lombok/1.18.22/lombok-1.18.22.pom (1.5 kB at 6.1 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/org/projectlombok/lombok/1.18.22/lombok-1.18.22.jar
Downloaded from central: https://repo.maven.apache.org/maven2/org/projectlombok/lombok/1.18.22/lombok-1.18.22.jar (2.0 MB at 12 MB/s)
[INFO]
[INFO] --- maven-resources-plugin:3.3.1:resources (default-resources) @ springboot-webflux-demo ---
[INFO] Copying 1 resource from src/main/resources to target/classes
[INFO] Copying 0 resource from src/main/resources to target/classes
[INFO]
[INFO] --- maven-compiler-plugin:3.11.0:compile (default-compile) @ springboot-webflux-demo ---
[INFO] Changes detected - recompiling the module! :dependency
[INFO] Compiling 1 source file with javac [debug release 17] to target/classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.313 s
[INFO] Finished at: 2023-10-28T12:32:31-07:00
[INFO] ------------------------------------------------------------------------
Se eu percorrer manualmente cada fase, nunca conseguirei remover as dependências remotas até chegar à fase de compilação:
validate
initialize
generate-sources
process-sources
generate-resources
process-resources
compile <--
Não consegui encontrar nenhuma documentação granular sobre o que mvn compile
realmente está acontecendo.
Pergunta:
O que há de único na fase de compilação que dá início a essa pré-etapa de resolução de dependência que parece viver fora das fases e do ciclo de vida maior?
A execução
mvn dependency:resolve
no final executarámaven-dependency-plugin
ou, mais precisamente, executará oresolve
objetivo do plugin manualmente ( https://maven.apache.org/plugins/maven-dependency-plugin/resolve-mojo.html ) sem iniciar o ciclo de vida.O próprio Second Maven não usa o
maven-dependency-plugin
para resolver dependências (ou baixá-las). Isso é feito pelo próprio Maven (precisamente pelo resolvedor; não é tão importante no momento).A ligação existente para o ciclo de vida e os plug-ins está vinculada na descrição apropriada.
Agora chegando à resolução das dependências (download dos artefatos).
Se você pensar nas diferentes fases com os plugins vinculados como maven-resources-plugin, maven-compiler-plugin etc. para executar o maven-resources-plugin não é necessário baixar artefatos (exceto o próprio plugin e suas dependências), mas como você já percebeu, para executar o maven-compiler-plugin, as dependências devem ser baixadas (o que resulta em serem colocadas no caminho de classe) antecipadamente antes de poder compilar o código.
Existem marcadores (atributos da anotação) nos plugins que informam ao núcleo se é necessário resolver as dependências antes que o plugin seja chamado.
No código-fonte do maven-compiler-plugin mostra algo assim:
A parte importante é a linha
requiresDependencyResolution = ResolutionScope.COMPILE
. Este é responsável por dizer ao núcleo para resolver as dependências antes que o plugin em si seja executado.Se você olhar para o maven-compiler-plugin, mas agora para o
testCompile
objetivo, o código será assim:A linha aqui:
requiresDependencyResolution = ResolutionScope.TEST
está dizendo ao núcleo para resolver todas as dependências no escopotest
(para compilar o código de teste).A linha
Requires dependency resolution of artifacts in scope: compile.
é equivalente à parte mostrada anteriormente do código-fonte (a página de documentação é gerada a partir do código-fonte).Portanto, com base na fase do ciclo de vida
compile
que vincula ocompile
objetivo do Maven Compiler Plugin a ele (conforme mencionado para as ligações ).Precisamente, não é o ciclo de vida a parte responsável, é o objetivo do plugin que diz ao núcleo para resolver as dependências antes de chamar o próprio objetivo do plugin.