将maven嵌入到OSGi应用程序中

时间:2010-05-31 13:32:47

标签: osgi maven

我试图从我的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”等内容。

有什么想法吗?感谢。

1 个答案:

答案 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;
    }

如果需要进一步的详细信息,请与我们联系。我会发布所有代码,但它分布在众多文件中。祝你好运。