org.codehaus.mojo 插件 源码分析

org.codehaus.mojo 插件执行原理

使用 mvn -X 调试命令可以发现org.codehaus.mojo 插件 最后执行的命令。

1
[DEBUG] Executing command line: [D:\Software\Java\Jdk\7\jdk1.7.0_51\Jdk\bin\java.exe, -Xms128m, -Xmx3048m, -jar, E:\Svn\Bitbucket\apptalking\agent\app-server-agent-ob/lib/allatori.jar, E:\Svn\Bitbucket\apptalking\agent\app-server-agent-ob/allatori.xml]

org.codehaus.mojo 其实就做了一件事情,使用java 程序调用 allatori.jar 并传入配置文件路径参数。

参数处理

  • XML文件中可以配置参数
  • 从环境变量中获取 java.exe 路径

如何查找 java 执行程序

mojo 插件会获取系统中配置的全部环境变量信息,生成List集合类,paths 就是系统配置环境变量路径。executable 查找的可执行程序,java 可执行的程序的名称为 java。 path/executable(java) 文件如果存在,就返回路径。用于执行 jar 文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
org.codehaus.mojo.exec.ExecMojo

static String findExecutable( final String executable, final List<String> paths )
{
File f = null;
search: for ( final String path : paths )
{
f = new File( path, executable );
if ( !OS.isFamilyWindows() && f.isFile() )
break;
else
for ( final String extension : getExecutableExtensions() )
{
f = new File( path, executable + extension );
if ( f.isFile() )
break search;
}
}

if ( f == null || !f.exists() )
return null;

return f.getAbsolutePath();
}

executable 自定义JDK路径

如果 executable 配置为 java 就会按照上面的程序执行查找动作,如果executable配置 java path的全路径,按照上面的逻辑是找不到的,org.codehaus.mojo 直接使用executable 为 java 程序路径。
可以按照以下配置来指定JDK的版本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<executions>
<execution>
<id>run-allatori</id>
<phase>package</phase>
<goals>
<goal>exec</goal>
</goals>
</execution>
</executions>
<configuration>
<executable>D:\Software\Java\Jdk\7\jdk1.7.0_51\Jdk\bin\java</executable>
<arguments>
<argument>-Xms128m</argument>
<argument>-Xmx3048m</argument>
<argument>-jar</argument>
<argument>${basedir}\lib\allatori.jar</argument>
<argument>${basedir}\allatori.xml</argument>
</arguments>
</configuration>
</plugin>

源码

参考 https://github.com/mojohaus/exec-maven-plugin/blob/exec-maven-plugin-1.6.0/src/main/java/org/codehaus/mojo/exec/ExecMojo.java