17

我正在尝试创建一个需要在当前项目上执行 maven 目标的 intelliJ 插件。intertubes 中的所有讨论都建议使用 MavenEmbedder。祝你好运。2.0.4 版本没有得到很好的支持,也没有关于如何使用它的参考资料。

我试了一下,然后撞到了一堵墙,嵌入器没有用它需要的所有字段进行初始化。反射私有成员注入?惊人的!为什么有人需要一种明显的方法来初始化对象?

似乎有些人正在使用 2.1 版本并取得了一些成功。我一直无法在罐子甚至来源中找到它。

我去检查了嵌入项目的 3.0 版本:http : //maven.apache.org/ref/3.0-beta-3/maven-embedder/ 它完全取消了 MavenEmbedder 对象,似乎只支持访问通过 MavenCli 上的 main 或 doMain 方法。有没有人使用过这些方法并可以提供一些建议?

4

6 回答 6

25

是的,MavenCli 文档的方式并不多。API 非常简单,但我仍然想要一些示例。这是一个有效的...

MavenCli cli = new MavenCli();
int result = cli.doMain(new String[]{"compile"},
        "/home/aioffe/workspace/MiscMaven",
        System.out, System.out);
System.out.println("result: " + result);

它需要一个目录并运行“编译”阶段......

于 2011-06-06T17:04:56.553 回答
14

工作的Maven配置maven 3.6.3

代码

MavenCli cli = new MavenCli();
System.setProperty("maven.multiModuleProjectDirectory", workingDirectory);
cli.doMain(new String[]{"compile"}, workingDirectory, System.out, System.err);

依赖项

<dependencies>
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-embedder</artifactId>
        <version>3.6.3</version>
    </dependency>
    <!-- https://issues.apache.org/jira/browse/MNG-5995 -->
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-compat</artifactId>
        <version>3.6.3</version>
    </dependency>

    <!-- enable logging -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>1.7.30</version>
    </dependency>
</dependencies>
于 2013-11-11T10:37:46.377 回答
6

提供的范围和动态获取的组件的依赖矩阵信息可能有点混乱。对我来说,因为在我看来,我通过直接或传递依赖获得了所有必需的项目,但是远程解析不起作用。

我想跳到 Maven 3.3.3(最新的 2015-05-25)。当我尝试乐观地更新到此处(和其他地方)指定的当前版本时,我得到了它没有出现的 sisu 错误。这是一个带有标签的项目,该标签适用于今天使用 JDK8 指定的示例。

https://github.com/mykelalvis/test-maven-embedder/tree/20150525-working

相关部门(SLF4J 只是为了让我可以看到日志)

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>1.7.5</version>
    </dependency>
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-embedder</artifactId>
        <version>3.3.3</version>
    </dependency>
    <dependency>
        <groupId>org.eclipse.aether</groupId>
        <artifactId>aether-connector-basic</artifactId>
        <version>1.0.2.v20150114</version>
    </dependency>
    <dependency>
        <groupId>org.eclipse.aether</groupId>
        <artifactId>aether-transport-wagon</artifactId>
        <version>1.0.2.v20150114</version>
    </dependency>
    <dependency>
        <groupId>org.apache.maven.wagon</groupId>
        <artifactId>wagon-http</artifactId>
        <version>2.9</version>
    </dependency>
    <dependency>
        <groupId>org.apache.maven.wagon</groupId>
        <artifactId>wagon-provider-api</artifactId>
        <version>2.9</version>
    </dependency>
    <dependency>
        <groupId>org.apache.maven.wagon</groupId>
        <artifactId>wagon-http-lightweight</artifactId>
        <version>2.9</version>
    </dependency>   

运行它是:

rm -r ~/.m2/repository/org/apache/maven/plugins/maven-clean-plugin/
mvn exec:java

可能应该使它成为某种单元测试。

如果有人对嵌入式 Maven 3.3.3 有更好的解决方案(即提出了一组更小或更面向范围的所需依赖项),请发布它们。

于 2015-05-25T13:47:50.587 回答
0

以@StevePerkins 的评论为基础,并使用 maven 3.1.0 版,

我必须排除从 aether-connector-wagon 到 wagon-provider-api 的传递依赖才能使其正常工作。

pom.xml:

(...)
<dependency>
    <groupId>org.apache.maven</groupId>
    <artifactId>maven-embedder</artifactId>
    <version>3.1.0</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.eclipse.aether</groupId>
    <artifactId>aether-connector-wagon</artifactId>
    <version>0.9.0.M2</version>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <groupId>org.apache.maven.wagon</groupId>
            <artifactId>wagon-provider-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.apache.maven.wagon</groupId>
    <artifactId>wagon-http</artifactId>
    <version>2.5</version>
    <scope>test</scope>
</dependency>
(...)

这是一个Java示例:

(...)
MavenCli cli = new MavenCli();

ByteArrayOutputStream baosOut = new ByteArrayOutputStream();
ByteArrayOutputStream baosErr = new ByteArrayOutputStream();

PrintStream out = new PrintStream(baosOut, true);
PrintStream err = new PrintStream(baosErr, true);

cli.doMain( new String[] { "clean" }, new File("."), out, err );

String stdout = baosOut.toString("UTF-8");
String stderr = baosErr.toString("UTF-8");
(...)

完整的例子在这里

于 2013-09-22T14:19:27.417 回答
0

每个版本的 maven-embedder 都有一个依赖矩阵,例如 3.2.5:http ://maven.apache.org/ref/3.2.5/maven-embedder/dependencies.html

基于此,我不得不使用org.apache.maven:maven-embedder:jar:3.2.5,org.apache.maven:maven-aether-provider:jar:3.2.5org.apache.maven.wagon:wagon-provider-api:jar:2.8.

它还修复了对非常旧的 Guava 库的依赖,因为这个版本使用的是 18.0。

于 2015-02-09T13:19:52.240 回答
0

在我的 Spring Boot 2.3 项目(JDK8 或 JDK 11 运行时)中工作的 Maven Embedded 3.6.3 版本的依赖项列表:

    <!-- Maven Embedder -->
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-embedder</artifactId>
        <version>3.6.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-compat</artifactId>
        <version>3.6.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.maven.wagon</groupId>
        <artifactId>wagon-http</artifactId>
        <version>3.3.4</version>
    </dependency>
    <dependency>
        <groupId>org.eclipse.aether</groupId>
        <artifactId>aether-connector-basic</artifactId>
        <version>1.1.0</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.eclipse.aether</groupId>
        <artifactId>aether-transport-wagon</artifactId>
        <version>1.1.0</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>1.7.30</version>
    </dependency>
    <dependency>
        <groupId>org.usefultoys</groupId>
        <artifactId>slf4j-toys</artifactId>
        <version>1.6.3</version>
    </dependency>

Maven CLI 命令如下所示:

    // Maven CLI to execute Maven Commands
    MavenCli cli = new MavenCli();
    int result = cli.doMain(args, workingDirectory,
                    org.usefultoys.slf4j.LoggerFactory.getInfoPrintStream(LOGGER),
                    org.usefultoys.slf4j.LoggerFactory.getErrorPrintStream(LOGGER));

高温高压

于 2020-07-15T07:10:56.030 回答