2012-07-30 70 views
1

我的多模块项目包含10个模块,其中3个需要第三方jni。三者必须解压jni构件,并将其位置添加到LD_LIBRARY_PATH以进行测试执行。将JNI添加到多模块项目中的某些并非全部模块

什么是优雅的maven方式来处理这种情况?

  • 添加依赖项,通过maven-dependency-plugin执行surefire属性解包到这三个模块(违反dont-repeat-yourself原则并且不会缩放)。
  • 使用的简档在中央POM对于这些步骤,并与needsFooJni属性激活它(配置文件不是每个模块和应该用于平台或其它积聚宽需求)
  • 通过在顶层POM属性控制使用处决(似乎有点脆弱)。

那么,什么是优雅的maven方式来处理这种情况,所以我的本地依赖项被用于测试阶段。

感谢

彼得

+0

如果您的所有模块为测试添加了这种依赖关系,会发生什么情况?您可以在主要的pom.xml中添加注释,说明这对于以下模块是必需的:a,b,c。 – 2012-07-30 16:56:55

回答

1

我选择了这个解决方案:

  • 默认JNI位置添加顶级性能。在下面的示例中,我还为JNI添加了一个“特殊”情况,该情况需要特定的结构来查找其他资源。 `$ {} project.basedir /目标/提取 $ {} project.basedir /目标/缓存/特殊 $ {extractedJniCache} $ {path.separator} $ {} specialExceptionLibrayCache”

  • 添加属性来控制通过跳跃特性(缺省为跳过和各个模块可以重写

  • 以我万无一失控制提取

    <skipSpecialJNIExtraction>true<skipSpecialJNIExtraction> <skipFooBarJNIExtraction>true<skipFooBarJNIExtraction>

  • 定义依赖萃取处决配置定义路径和ld库路径 <environmentVariables> <PATH>${env.PATH}${path.separator}${ldLibraryAddon}</PATH> <LD_LIBRARY_PATH>${ldLibraryAddon}</LD_LIBRARY_PATH> `

默认情况下,所有的测试目录添加了JNIs到PATH/LD_LIBRARY_PATH执行测试。这些目录仅在模块重写跳过属性时才存在。

它没有我想要的那么优雅,但它集中在主pom保持复杂性在一个地方,保持模块poms小。

1

如何定义中的父POM的<pluginManagement>部分中<dependencyManagement>的依赖和插件只有在需要它的三个模块使用它们?

2

我建议创建/ modifiy结构,以类似下面:

root (pom.xml) 
    +--- mod1 (pom.xml) 
    +--- mod2 (pom.xml) 
    . 
    . 
    +--- mod7 (pom.xml) 
    +--- modX (pom.xml) 
     +--- mod-jndi1 (pom.xml) 
     +--- mod-jndi2 (pom.xml) 
     +--- mod-jndi3 (pom.xml) 

在根(pom.xml的),你可以定义为整个项目commong东西(dependencyManagement,pluginManagement)等

在modX(pom.xml)中,您可以定义特殊的依赖关系,pluginManagmenet部分,这些部分仅用于mod-jndi1 ... 3模块,以及像您之前提到的用于确定性测试的配置。