Maven原生插件中的荒唐样板

时间:2013-07-28 19:38:36

标签: java maven java-native-interface native boilerplate

我目前正在重写我的OSS项目netlib-java,以便开发人员和最终用户尽可能轻松地使用。

但是,作为maven-native设置的一部分,我似乎需要为我想要创建的每个本机二进制文件单独pom.xml。这些文件中的绝大多数在不同平台上实际上是相同的。

如何减少原生构建文件的样板?,例如:

(除了输出文件的名称,编译器标志和javah的目标平台之外,几乎所有内容都在OS目标之间共享。)

其他一些较小但相关的问题:

  • 我只想分发捆绑的jar,如何关闭jnilib(等)部署,而是使用默认jar部署classifier(我可以创建一个{{} 1}}分类器jar,但这对最终用户来说是不方便的。)
  • 显然,我永远无法一次性构建整个项目(因为有几个OS本机目标)。但是,Maven坚持尝试编译它们是模块的东西。如何设置依赖关系树/工作流,以便最终用户只需要依赖一个项目来获取所有本地jar?

1 个答案:

答案 0 :(得分:2)

maven的继承功能可以大大减少您的样板代码。 为了简单起见,我省略了javah和其他JNI东西,只创建了两个C项目和一个共同的父项目。 目录结构是这样的:

+-NativeParent
! !
! +-src/main/native
! +-pom.xml
+-NativeTest1
! !
! +-pom.xml
+-NativeTest2
  !
  +-pom.xml

NativeParent包含所有源代码,pom.xml几乎包含所有定义:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

   <groupId>test</groupId>
   <artifactId>nativeParent</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>pom</packaging>

    <name>parent-pom</name>

    <modules>
        <module>../NativeTest1</module>
        <module>../NativeTest2</module>
    </modules>

    <dependencies>
    </dependencies>



   <build>
     <plugins>
       <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>native-maven-plugin</artifactId>
         <extensions>true</extensions>
         <configuration>

           <sources>
             <source>
               <directory>../NativeParent/src/main/native</directory> 
               <fileNames>
                 <fileName>krbwinclient.c</fileName>
               </fileNames>
             </source>          
           </sources>

           <linkerStartOptions>
             <linkerStartOption>-Wl,--kill-at</linkerStartOption>
             <linkerStartOption>-shared</linkerStartOption>
           </linkerStartOptions>
           <linkerEndOptions>
            <linkerEndOption>-lSecur32</linkerEndOption>
            <linkerEndOption>-lOle32</linkerEndOption>
           </linkerEndOptions>
         </configuration>
         </plugin>

         </plugins>
    </build>

</project>

NativeTest1和NativeTest2的poms非常精简,因为它们只需要定义与父pom不同的属性。

NativeTest1:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

    <parent>
       <groupId>test</groupId>
       <artifactId>nativeParent</artifactId>
       <version>0.0.1-SNAPSHOT</version>
    </parent>

   <groupId>test</groupId>
   <artifactId>native1</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>so</packaging>

   <build>
    <finalName>native1.so</finalName>
     <plugins>
       <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>native-maven-plugin</artifactId>
         <extensions>true</extensions>
         <configuration>
           <compilerStartOptions>
             <compilerStartOption>-Wl,--add-stdcall-alias</compilerStartOption>
             <compilerStartOption>-DBUILD_SO</compilerStartOption>
           </compilerStartOptions>

         </configuration>
         </plugin>

         </plugins>
    </build>

</project>

和NativeTest2:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

    <parent>
       <groupId>test</groupId>
       <artifactId>nativeParent</artifactId>
       <version>0.0.1-SNAPSHOT</version>
    </parent>

   <groupId>test</groupId>
   <artifactId>native2</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>dll</packaging>

   <build>
    <finalName>native1.so</finalName>
     <plugins>
       <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>native-maven-plugin</artifactId>
         <extensions>true</extensions>
         <configuration>
           <compilerStartOptions>
             <compilerStartOption>-Wl,--add-stdcall-alias</compilerStartOption>
             <compilerStartOption>-DBUILD_DLL</compilerStartOption>
           </compilerStartOptions>

         </configuration>
         </plugin>

         </plugins>
    </build>

</project>

唯一不同的是package-type,target-name和compile-options,但大部分配置都来自parent-pom。

注意只有一个compilerStartOption-Property,所​​以尽管你可以在child-pom中使用几个同名的属性,你将失去父pom中所有同名的条目。

我希望这是你想要的东西 - 它仍然是一些样板代码,但它大大减少了。