1

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

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

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

那么,处理这种情况的优雅 Maven 方法是什么,所以我的本机依赖项用于测试阶段。

谢谢

彼得

4

3 回答 3

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)

在根目录(pom.xml)中,您可以为整个项目(dependencyManagement、pluginManagement)等定义公共事物。

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

于 2012-07-31T07:42:39.910 回答
1

如何定义父 pom 部分内的依赖项<dependencyManagement>和插件,<pluginManagement>并仅在需要它的三个模块中使用它们?

于 2012-07-30T17:09:56.240 回答
1

我选择了这个解决方案:

  • 为默认 JNI 位置添加顶级属性。在下面的示例中,我还为需要特定结构来定位其他资源的 JNI 添加了一个“特殊”案例。`${project.basedir}/target/extracted ${project.basedir}/target/cache/special ${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 上,将复杂性集中在一个地方,并保持模块 pom 小。

于 2012-07-31T14:02:50.660 回答