Можно ли, например, вызывать цели Maven из Java, я могу сделать эквивалент:
mvn clean package
из класса Java?
спасибо, Ник
Можно ли, например, вызывать цели Maven из Java, я могу сделать эквивалент:
mvn clean package
из класса Java?
спасибо, Ник
вам необходимо использовать API-интерфейс Maven Embedder.
Обновленная ссылка 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);
Конфигурация проекта:
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-embedder</artifactId>
<version>3.1.1</version>
</dependency>
<dependency>
<groupId>org.eclipse.aether</groupId>
<artifactId>aether-connector-wagon</artifactId>
<version>0.9.0.M2</version>
</dependency>
<dependency>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-http-lightweight</artifactId>
<version>2.5</version>
</dependency>
</dependencies>
Полностью рабочий пример: 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 ...
Но на самом деле это будет происходить по всем папкам (рекурсивно) и будет пытаться проверить все проекты там, даже если я этого не хочу. Если если что-то не так - , это не работает.
Если вы пытаетесь сделать то же самое только с командной строкой - он будет вызывать только 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;
}