Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java调用Maven目标_Java_Maven 2 - Fatal编程技术网

从Java调用Maven目标

从Java调用Maven目标,java,maven-2,Java,Maven 2,是否可以从Java调用Maven目标,例如,我可以执行以下等效操作: mvn clean package 来自Java类 谢谢, 尼克当然,你需要使用 更新的链接是我不建议使用MAVEN CLI,因为它的工作方式与命令行选项不同。例如: 使用CLI,我想重现“mvn依赖项:解析验证” 但实际上,它将遍历所有文件夹(递归),并尝试验证那里的所有项目,即使我不想要它。如果出现问题-它会失败 但是,如果您尝试对命令行执行相同的操作,它将只调用pom.xm,并将成功完成(即使“projectPath”

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

mvn clean package
来自Java类

谢谢,
尼克

当然,你需要使用


更新的链接是

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

使用CLI,我想重现“mvn依赖项:解析验证”

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

但是,如果您尝试对命令行执行相同的操作,它将只调用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;
    }
这很简单:)

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>

org.apache.maven

这可能不再是正确答案。maven embedder似乎已经从Maven3中消失了:您的答案是旧的,所以很可能嵌入式maven已经改进了。现在,即使使用嵌入式maven,
-f
选项也工作得非常好。我使用了绝对路径(从未尝试过相对路径)。
<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>