将JNI添加到多模块项目中的某些模块中

时间:2012-07-30 16:24:45

标签: maven multi-module

我的multimodule项目包含10个模块,其中3个模块需要第3方jni。这三个必须解压缩jni工件并将其位置添加到LD_LIBRARY_PATH以进行测试执行。

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

  • 添加依赖项,通过maven-dependency-plugin执行surefire属性解压缩到三个模块(违反dont-repeat-yourself原则,不会扩展)。
  • 在中央pom中使用配置文件来执行这些步骤,并使用needsFooJni属性激活它(配置文件不是每个模块,应该用于平台或其他构建范围的需求)
  • 使用由顶级pom中的属性控制的执行(看起来有点脆弱)。

那么,处理这种情况的优雅maven方法是什么,所以我的本机依赖关系在测试阶段使用。

由于

彼得

3 个答案:

答案 0 :(得分:2)

我建议创建/修改结构,如下所示:

 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)

在root(pom.xml)中,您可以为整个项目定义commong事物(dependencyManagement,pluginManagement)等。

在modX(pom.xml)中,您可以定义特殊的依赖项,pluginManagmenet部分仅用于mod-jndi1 ... 3模块,以及您已经提到的surefire测试的配置。

答案 1 :(得分:1)

如何在父{0}}中的<dependencyManagement><pluginManagement>部分中定义依赖关系,并仅在需要它的三个模块中使用它们?

答案 2 :(得分:1)

我选择了这个解决方案:

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

  • 添加属性以控制提取

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

  • 定义由跳过属性控制的依赖项提取执行(默认为跳过,各个模块可以覆盖

  • 在我的surefire配置中定义路径和ld库路径 <environmentVariables> <PATH>${env.PATH}${path.separator}${ldLibraryAddon}</PATH> <LD_LIBRARY_PATH>${ldLibraryAddon}</LD_LIBRARY_PATH> `

默认情况下,所有测试都会将JNI的目录添加到PATH / LD_LIBRARY_PATh以进行测试执行。仅当模块覆盖跳过属性时,这些目录才会存在。

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