如何为paxexam而不是maven工件指定一个功能?

时间:2017-10-24 19:28:32

标签: java maven osgi karaf pax-exam

我在一个大型代码库上工作,它的构建产生了在Karaf中加载的OSGi包。我们有一堆PaxExam测试。所有这些现有测试都通过他们的maven GAV加载功能。

我想编写一个测试,其唯一目的是验证所有必需的包加载。测试方法本身可能是空的。

我想指定要仅通过功能名称加载的功能,而不是通过与该功能关联的maven工件加载。

例如,这是一个现有的配置选项块,与其他测试中的所有其他块类似:

@Configuration
public Option[] config() {
    return new Option[] {
            karafDistributionConfiguration()
            .frameworkUrl(maven().groupId("org.apache.karaf").artifactId("apache-karaf").type("zip")
                    .versionAsInProject())
                    .useDeployFolder(false).unpackDirectory(new File("target/paxexam/unpack/")),
                    systemProperty("sl.config.dir").value("${karaf.etc}"),
                    features(maven().groupId("com.att.detsusl").artifactId("usl-servicefactory-impl").type("xml")
                            .classifier("features").versionAsInProject(), "webconsole", "usl-servicefactory"),
                            logLevel(LogLevelOption.LogLevel.WARN), 
                            when(Boolean.parseBoolean(System.getProperty("debug"))).useOptions(KarafDistributionOption.debugConfiguration("5005", true)),
                            keepRuntimeFolder()
    };
}

以下是相关features.xml文件的正文:

<feature name='usl-all'>
    <feature>usl-servicefactory</feature>
</feature>

如何变换先前的配置选项块以使其指定“usl-all”功能,而无需指定Maven GAV?

更新

遗憾的是,我无法编写仅仅验证特定功能加载的测试,而不会通过非显而易见的路径。

尽管如此,我认为这是我能做的最好的事情,除了我在这里遇到的另一个问题。

提供的解决方案实际上不起作用,因为此捆绑包的POM未将该工件指定为依赖项,因此“versionAsInProject()”基本上失败。 bundle的目的只是声明该功能及其包含的功能,该功能来自不同的bundle,它确实将该工件声明为依赖。

我的目的是在声明包含功能的包中编写测试,即使它没有任何maven依赖项,或者生成除了功能声明之外的任何工件。

我确实尝试简单地硬编码版本字符串ala'version(“...”)',以提供“versionAsInProject()”提供的版本。这确实有效,但这不是一个可以接受的解决方案。

然后我尝试使用模块POM本身的GA,以及“versionAsInProject()”。这实际上有效,但我真的需要了解它实际上在做什么。引用的GA和功能名称彼此没有多大关系。基本的想法是什么哪个引用GA无关紧要,只要它存在于某个POM中,并且功能名称只是查看所有声明的功能?

1 个答案:

答案 0 :(得分:0)

你不能,你总是需要指定一个Maven GAV。 所以你需要做的是:用这个替换现有的功能定义块。

getContainer(function(array1,array2){
   if(array1 && array2 && array1.length>0 && array2.length>0){
var mergedList = _.map(array1, function(data){
                                return _.extend(data, _.findWhere(array2, { id: data.accountId }));
                            });
                            console.log(mergedList);
}
})