Подтвердить что ты не робот

Вызов целей Maven из Java

Можно ли, например, вызывать цели Maven из Java, я могу сделать эквивалент:

mvn clean package

из класса Java?

спасибо, Ник

4b9b3361

Ответ 2

Это легко:)

Код 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

Ответ 3

Я бы не рекомендовал использовать 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;
    }