想在maven编译过程中输出动态的文件,晚上稍微看了下maven的实现,还没研究完。先记录下来。
maven启动的命令行:
在windows上,mvn=mvn.cmd。
mvn执行的命令行如下:
"C:\Program Files\Java\jdk1.8.0_261\bin\java.exe"
-classpath "D:\DataCenter\Program\apache-maven-3.5.0\bin\..\boot\plexus-classworlds-2.5.2.jar"
"-Dclassworlds.conf=D:\DataCenter\Program\apache-maven-3.5.0\bin\..\bin\m2.conf"
"-Dmaven.home=D:\DataCenter\Program\apache-maven-3.5.0\bin\.."
"-Dmaven.multiModuleProjectDirectory=D:\dev\git\demo-app"
org.codehaus.plexus.classworlds.launcher.Launcher clean package
主类是:org.codehaus.plexus.classworlds.launcher.Launcher
在 plexus-classworlds-2.5.2.jar 中找到它。
里面有对m2.conf的解析过程。该文件的解析也比较硬核:支持 main is … from/set … defult/[]/load/optionally/import … from 的写法。乍一看还以为是个ini文件。
这里感觉应该是 classworlds 的范围,里面有个realm的概念,感觉像是jar包库的意思。
plexus-classworlds 会在初始化后把控制权交给 2.conf 中的 main 定义的 class: org.apache.maven.cli.MavenCli
在 maven-embedder-3.5.0.jar 中。
入口也是main。
乍一看Jansi还以为是拼音,其实是J + ansi。
在doMain中有一大堆执行过程:
initialize( cliRequest );
cli( cliRequest );
logging( cliRequest );
version( cliRequest );
properties( cliRequest );
localContainer = container( cliRequest );
commands( cliRequest );
configure( cliRequest );
toolchains( cliRequest );
populateRequest( cliRequest );
encryption( cliRequest );
repository( cliRequest );
return execute( cliRequest );
在execute里面才是执行的内容,里面有行:
maven.execute( request );
就是交给maven这个实体了。它在前面执行的这个地方:
maven = container.lookup( Maven.class );
这个看起来是不是像spring。
Maven的实现是在 maven-core-3.5.0.jar 中的 org.apache.maven.DefaultMaven
看到这里,就有@Requirement @Component 的注解,这货完全像spring了,plexus 也是一个IOC容器?
明天再接着看。