2012-03-09 21 views
1

我有一個使用maven-nar插件構建和打包的本地共享庫。這很好,建立在Linux/MacOSX/Windows上。我還定義了一個使用maven-nar構建的JNI庫,它包裝共享庫。這兩個都是作爲NAR工件生成的,並且需要使用maven-nar插件才能使用。在webapp中使用原生Maven工件(nar)

從非NAR打包的項目中聲明對這些NAR的依賴關係時出現問題。 maven-nar插件似乎永遠不會被調用。只有當我將項目的包裝改爲NAR時,maven-nar插件纔會啓動。這使得看起來NAR包裝需要具有傳染性才能工作,如果有NAR依賴項,則所有上游項目都需要進行NAR打包。這是正確的還是我錯過了什麼?

使用maven-nar插件生成的本地共享庫和JNI工件是否可以成功用於Web應用程序,即WAR?如果它們可以在WAR中使用和部署,那麼它是如何完成的?否則,是將手動庫手動放置在應用程序服務器的java.library.path中的某個位置的唯一選項?

這裏的POM的依賴於NAR JNI神器項目的一個片段:

<?xml version="1.0" encoding="UTF-8"?> 
    <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/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <parent> 
    <groupId>thegroup</groupId> 
    <artifactId>theparent</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <relativePath>../pom.xml</relativePath> 
    </parent> 

    <artifactId>thedependant</artifactId> 
    <packaging>jar</packaging> 
    <name>A nice name</name> 

    ... 

    <properties> 
    <skipTests>true</skipTests> 
    </properties> 

    ... 

    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-nar-plugin</artifactId> 
     <version>2.1-SNAPSHOT</version> 
     </plugin> 
    </plugins> 
    </build> 

    ... 

    <dependencies> 
    <dependency> 
     <groupId>thegoup</groupId> 
     <artifactId>theJNI</artifactId> 
     <version>1.0-SNAPSHOT</version> 
     <type>nar</type> 
    </dependency> 
    </dependencies> 

    ... 

</project> 
+0

你能發佈相關的pom片段嗎?應該可以將本地庫聲明爲「war」類型項目的依賴關係 – Raghuram 2012-03-09 03:47:22

回答

0

沒有,或者至少不容易。

如果你有JNI,你需要混淆-Djava.library.path和LD_LIBRARY_PATH/DYLD_LIBRARY_PATH/PATH,以及啓動整個容器時發生的一切。沒有任何機制可以將戰爭中的所有內容傳播到容器中。

在成熟的Java EE中,JCA模型的目的是將本地代碼集成到Web應用程序中。但是典型的輕量級容器不支持它。

如果您的本機代碼不依賴其他共享庫,並且您不關心JVM本機代碼衝突(給定的本機類只能在一個類加載器中),那麼您的問題僅僅是獲取共享將對象全部放入戰爭文件中。

http://maven.apache.org/plugins/maven-war-plugin/examples/adding-filtering-webresources.html

是一種方法。使用maven-dependency-plugin將共享庫放到$ {project.build.directory}下的某個目錄中,然後將其作爲「web資源」選取。

+0

因此,唯一的方法是將特定於平臺的共享庫提取到臨時文件並使用某種自定義加載程序加載它們?根據需要通過依賴項遞歸來提取和加載其本機庫。 – JerryF 2012-03-09 15:24:30

+0

這並不能解決問題。你最大的問題是當Tomcat或其他什麼東西首先被啓動時,改變jvm命令行選項。 – bmargulies 2012-03-09 15:25:31

+0

如果我使用System.loadLibrary()來加載這些庫,情況不會如此嗎?我可以使用System.load(),並提供臨時文件的路徑,避免弄亂環境和java.library.path。 – JerryF 2012-03-09 15:30:10

相關問題