谁能给编程方式使用org.apache.maven.cli.MavenCli的一个很好的例子?
题
我试图创建一个的IntelliJ插件,需要对当前项目执行Maven的目标。在intertubes所有的谈话建议使用MavenEmbedder。祝你好运。 2.0.4版本不能很好地支持,并有对如何使用它的引用。
我给它一个旋转,冲进其中嵌入尚未初始化它需要的所有领域的墙上。反光私有成员注射?真棒!为什么会有人需要一个显而易见的方法来初始化一个对象?
这似乎是一个少数人使用的是2.1版本取得了一些成功。我一直无法找到,在一个罐子,甚至来源。
我去检查了3.0版本的嵌入项目: http://maven.apache.org/ref/3.0-beta-3/maven-embedder/ 它摒弃了MavenEmbedder对象一起,似乎通过对MavenCli主或域方法只支持接入。有没有人使用这些方法,可以给些建议吗?
解决方案
呀,没有太多的MavenCli的文档的方式。 API是significatly简单,但我还是想一些例子。这里有一个工程......
MavenCli cli = new MavenCli();
int result = cli.doMain(new String[]{"compile"},
"/home/aioffe/workspace/MiscMaven",
System.out, System.out);
System.out.println("result: " + result);
它需要一个目录,并运行“编译”阶段...
其他提示
有maven 3.1.1
工作行家配置
依赖关系
<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>
代码
MavenCli cli = new MavenCli();
cli.doMain(new String[]{"clean", "compile"}, "project_dir", System.out, System.out);
为提供范围和动态获取的部件的相关矩阵信息可以是有点混乱。这对我来说,因为它在我看来,我得到了所有需要的物品通过直接或传递依赖,但随后远程决议没有工作。
我希望跳到的Maven 3.3.3(最新为2015年5月25日)。我得到了它没有这种呈现时,我试图乐观更新到这里(和其他国家)规定的事情当前版本SISU错误工作。这与用指定为今天使用JDK8的示例工作了标签的项目。
https://github.com/mykelalvis/test-maven-嵌入器/树/ 20150525-工作
相关DEPS(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(即想出了一个更小或更面向范围设定需要的依赖的),请张贴他们。
的基础上从所述@StevePerkins评论,使用Maven版本3.1.0,
我不得不排除以太网连接器旅行车的传递性依赖于货车提供商的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");
(...)
完整的例子这里
有对于Maven的嵌入器,例如每个版本相关性矩阵为3.2.5: http://maven.apache.org/ REF / 3.2.5 /行家嵌/ dependencies.html
根据我不得不使用org.apache.maven:maven-embedder:jar:3.2.5
,org.apache.maven:maven-aether-provider:jar:3.2.5
,和org.apache.maven.wagon:wagon-provider-api:jar:2.8
。
它还修正很老的番石榴库的依赖关系,因为这个版本采用18.0。