簡體   English   中英

將 JNI 庫添加到本地 Maven Repository

[英]Adding a JNI library to the local Maven Repository

我希望使用 Maven 添加一個 JNI 庫,包括它的共享 object (.so) 文件到我的項目中。不幸的是,它還沒有在公共存儲庫中,所以我想我必須自己將它安裝在我的本地存儲庫中才能讓它工作。

我 go 如何將 Maven 中的本機部分包含在我的項目中(並最終使用復制依賴項插件導出)。 這是一個標准的 J2SE 應用程序(不是網絡應用程序),帶有 packaging.jar?

我要添加的庫是junixsocket ,以防萬一它有助於了解。 它有一個 .so(本機庫)組件和 Java.jar 組件。

我遇到了maven-nar-plugin ,它似乎以本機構建為目標,但似乎更傾向於從代碼構建 JNI 項目,而不是捆綁第 3 方 JNI 庫,而且我無法將拼圖拼湊在一起.

我如何 go 關於:

  1. 在我的本地存儲庫中安裝這些,具有 .jar 取決於 .so 庫。
  2. 在 POM 文件中包含依賴項(對 .jar 和 .so)。

謝謝。

我的方法:

.so文件放入具有平台特定分類器的存儲庫,如下所示: sqlite3-3.7.9-linux-x86_64.so 為所有需要的平台添加.so依賴項:

<dependency>
    <groupId>de.ch-werner</groupId>
    <artifactId>sqlite-jdbc</artifactId>
    <version>3.7.9</version>
    <type>so</type>
    <classifier>linux-x86_64</classifier>
</dependency>

使用此 maven 程序集插件配置將所有本機庫放入您的 dist 的lib/native目錄中:

<dependencySet>
    <outputDirectory>lib/native</outputDirectory>
    <outputFileNameMapping>${artifact.artifactId}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
    <unpack>false</unpack>
    <useProjectArtifact>false</useProjectArtifact>
    <useStrictFiltering>false</useStrictFiltering>
    <includes>
        <include>*:*:dll:*</include>
        <include>*:*:so:*</include>
        <include>*:*:jnilib:*</include>
    </includes>
</dependencySet>    

使用這個 class在應用程序啟動時加載庫(計划將分類器命名更改為GNU 三元組):

CtzJniUtils.loadJniLibsFromStandardPath(Launcher.class, "sqlite3")

在加載它之前,我在 jar 中包含了 .so 和額外的平台特定共享庫。 通過這種方式,它的部署方式與任何其他 jar 一樣。

完成此操作的項目示例,針對不同平台使用 multiple.so 是https://github.com/peter-lawrey/Java-Thread-Affinity

要查看的主要 class 是https://github.com/peter-lawrey/Java-Thread-Affinity/blob/master/src/main/java/com/higherfrequencytrading/affinity/impl/NativeAffinity.java

作為在運行時解壓庫的替代方法,您可以將它們存儲為 jars 中的 Maven 但在構建時解壓它們: http://www.buildanddeploy.com/node/17

maven-nativedependencies-plugin插件會自動為你做這件事,只要你遵循他們的命名約定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM