从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; }