我试图从我的OSGi插件项目中调用MavenCli。我已将正确的库添加到构建路径和清单中。我相信到目前为止我已经做了一切正确的事情,因为当我向调用maven的类添加一个main方法并在eclipse中运行它时,一切都按预期工作。当我从我的OSGi插件运行它时,我收到以下错误(使用maven开关-X -e):
Apache Maven 3.0-beta-1(r935667; 2010-04-19 10:00:39-0700) Java版本:1.6.0_16 Java home:C:\ Java \ jdk1.6.0_16 \ jre 默认语言环境:en_US,平台编码:Cp1252 操作系统名称:“windows 7”版本:“6.1”arch:“amd64”系列:“windows” [INFO]错误堆栈跟踪已打开。 [ERROR]执行Maven时出错。
org.codehaus.plexus.component.repository.exception.ComponentLookupException:在组件存储库中找不到组件描述符 角色:org.apache.maven.Maven roleHint: classRealm:无指定 at org.codehaus.plexus.DefaultComponentRegistry.getComponentManager(DefaultComponentRegistry.java:435) at org.codehaus.plexus.DefaultComponentRegistry.getComponent(DefaultComponentRegistry.java:353) 在org.codehaus.plexus.DefaultComponentRegistry.lookup(DefaultComponentRegistry.java:178) 在org.codehaus.plexus.DefaultPlexusContainer.lookup(DefaultPlexusContainer.java:383) 在org.apache.maven.cli.MavenCli.container(MavenCli.java:363) 在org.apache.maven.cli.MavenCli.doMain(MavenCli.java:156) 在org.apache.maven.cli.MavenCli.doMain(MavenCli.java:131)
我正在使用maven 3,beta 1,并使用以下方法调用:
int x = MavenCli.doMain(params.toArray(new String[] {}), null);
其中params包含“compile”等内容。
有什么想法吗?感谢。
答案 0 :(得分:0)
我通过将类加载器(this.getClass()。getClassLoader())传递给DefaultContainerConfiguration并将DefaultContainerConfiguration传递给DefaultPlexusContainer来实现这一点。使用plexus,我能够加载实例化MavenExecutionRequestPopulator和Maven对象。
然后,当我尝试执行任何目标时,我创建了一个MavenExecutionRequest并设置了Pom文件,系统和用户属性。系统属性从System获得,并具有我的-Dfoo = x属性等
在那之后,我使用了一种我无耻地偷走的方法(无法记住从哪里开始),但改编了一下......
public MavenExecutionResult execute(MavenExecutionRequest request) {
if (request == null) {
return null;
}
MavenExecutionResult result;
try {
populator.populateDefaults(request);
result = maven.execute(request);
} catch (MavenExecutionRequestPopulationException ex) {
ex.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
如果需要进一步的详细信息,请与我们联系。我会发布所有代码,但它分布在众多文件中。祝你好运。