0

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

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

如何减少本机构建文件的样板文件?,例如:

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

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

  • 我只想分发捆绑的 jar,如何关闭jnilib(等)部署,而是jar使用默认部署classifier(我可以创建native分类器 jar,但这对于最终用户来说很尴尬)。
  • 显然,我永远无法一次性构建整个项目(因为有多个操作系统本机目标)。但是,如果它们是模块,Maven 坚持尝试编译它们。如何设置依赖关系树/工作流,以便最终用户只需要依赖一个项目,该项目会拉入所有本机 jars?
4

1 回答 1

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 的 pom 可以非常精简,因为它们只需要定义与 parent-pom 不同的属性。

本机测试1:

<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>

唯一不同的是包类型、目标名称和编译选项,但大部分配置来自父 pom。

请注意,只有一个 compilerStartOption-Property,因此尽管您可以在子 pom 中使用多个同名属性,但您将丢失父 pom 中的所有同名条目。

我希望这是您正在寻找的那种东西 - 它仍然是一些样板代码,但它大大减少了。

于 2013-08-08T14:15:50.160 回答