从Java调用Maven目标

是否可以从Java调用Maven目标,例如,我是否可以执行以下操作:

mvn clean package 

来自Java类?

谢谢,尼克

绝对,您需要使用Maven Embedder API 。

更新的链接是http://maven.apache.org/ref/3-LATEST/maven-embedder/index.html

这很简单 :)

Java代码

 MavenCli cli = new MavenCli(); cli.doMain(new String[]{"clean", "package"}, "project_dir", System.out, System.out); 

项目配置:

   org.apache.maven maven-embedder 3.1.1   org.eclipse.aether aether-connector-wagon 0.9.0.M2   org.apache.maven.wagon wagon-http-lightweight 2.5   

完整的工作示例: https : //github.com/mariuszs/maven-cli-example

我不建议使用MAVEN CLI因为它与命令行替代方法的工作方式不同。 例如:

使用CLI,我想重现"mvn dependency:resolve validate"

 cli.doMain( new String[]{ "dependency:resolve", // download deps if needed "validate"}, // just validates, no need even to compile projectPath ... 

但实际上它将遍历文件夹(递归)并将尝试validation那里的所有项目,即使我不想要它。 如果出现问题 – 它会失败

但是,如果您尝试仅使用命令行执行相同操作 – 它将仅调用pom.xm并将成功完成 (即使’projectPath’中的某些项目无法解析。

使用CLI我无法使用“-f”标志来指定特定的pom.xml

这对我来说非常好:

 private int resolveAsCommandLine() { try { String command = "mvn " + "-f " + projectPath + "\\pom.xml " + "-Dmaven.repo.local=" + localRepoPath + "\\repository " + "-Dmaven.test.skip=true " + // ignore tests "dependency:resolve " + // download deps if needed "validate"; System.out.println("%> Executing command: '" + command + "'..."); Process p = Runtime.getRuntime().exec( // "cmd - for windows only" "cmd /c " + command ); BufferedReader in = new BufferedReader( new InputStreamReader(p.getInputStream()) ); String line = ""; while ((line = in.readLine()) != null) { System.out.println(line); if(line.contains("[ERROR]")) return ERROR_STATUS; if(line.contains("BUILD FAILURE")) return ERROR_STATUS; if(line.contains("BUILD SUCCESS")) return OK_STATUS; } in.close(); } catch (IOException e) { e.printStackTrace(); return ERROR_STATUS; } return ERROR_STATUS; }