gpt4 book ai didi

java - Maven native 插件中可笑的样板

转载 作者:行者123 更新时间:2023-12-02 06:52:02 24 4
gpt4 key购买 nike

我目前正在重写我的 OSS 项目 netlib-java让开发者和最终用户尽可能易于使用。

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

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

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

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

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

最佳答案

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

+-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 可以非常精简,因为它们只需要定义与父 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>

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

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

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

关于java - Maven native 插件中可笑的样板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17912077/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com