2012-03-09 3 views
1

maven-nar 플러그인을 사용하여 빌드하고 패키지화 된 네이티브 공유 라이브러리가 있습니다. 이것은 훌륭하게 작동하며 Linux/MacOSX/Windows에서 빌드됩니다. 또한 공유 라이브러리를 감싸는 maven-nar를 사용하여 빌드 된 JNI 라이브러리를 정의했습니다. 이 두 가지 모두 NAR 아티팩트로 생성되며 사용하려면 maven-nar 플러그인이 필요합니다.웹 응용 프로그램에서 네이티브 Maven 아티팩트 (nar) 사용

NAR 패키지가 아닌 프로젝트에서 이러한 NAR에 대한 종속성을 선언 할 때 문제가 발생합니다. maven-nar 플러그인은 절대로 호출되지 않습니다. 프로젝트의 패키징을 NAR로 변경했을 때만 maven-nar 플러그인이 시작됩니다. 이는 NAR 패키지가 감염되기 위해 감염 될 필요가있는 것처럼 보이게합니다. NAR 종속성이있는 경우 모든 업스트림 프로젝트는 NAR 패키지되어야합니다. 이게 맞습니까? 아니면 제가 빠진 것이 있습니까?

maven-nar 플러그인을 사용하여 생성 된 네이티브 공유 라이브러리 및 JNI 아티팩트가 웹 애플리케이션, 즉 WAR에서 성공적으로 사용될 수 있습니까? WAR에서 사용하고 배포 할 수 있다면 어떻게해야합니까? 그렇지 않으면, 응용 프로그램 서버의 java.library.path에있는 네이티브 라이브러리를 수동으로 배치하는 유일한 방법입니까? 적어도

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

답변

0

아니, 또는하지 쉽게 :

다음은 NAR JNI 이슈에 따라 프로젝트의 POM의 조각입니다.

JNI가있는 경우 -Djava.library.path와 LD_LIBRARY_PATH/DYLD_LIBRARY_PATH/PATH 및 전체 컨테이너 실행시 발생해야하는 모든 것을 처리해야합니다. 전쟁에서 컨테이너로 모든 것을 전파 할 수있는 메커니즘이 없습니다.

본격적인 Java EE에서 JCA 모델은 원시 코드가 웹 응용 프로그램에 통합되는 방식입니다. 그러나 일반적인 경량 컨테이너는이를 지원하지 않습니다.

네이티브 코드가 다른 공유 라이브러리와 아무런 관련이 없으며 JVM 네이티브 코드 충돌 (특정 네이티브 클래스가 하나의 클래스 로더에만있을 수 있음)에 관심이 없다면 문제는 단순히 공유 객체를 war 파일에 추가합니다.

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

하나의 방법입니다. maven-dependency-plugin을 사용하여 공유 라이브러리를 $ {project.build.directory} 아래의 디렉토리에 드롭 한 다음 '웹 리소스'로 가져옵니다.

+0

그래서 플랫폼 고유 공유 라이브러리를 임시 파일로 추출하고 일종의 커스텀 로더를 사용하여로드하는 것이 유일한 방법일까요? 고유 라이브러리를 추출하고로드하는 데 필요한 종속성을 반복합니다. – JerryF

+0

그래도 문제가 해결되지 않습니다. 가장 큰 문제는 Tomcat 또는 무엇이든 처음 실행될 때 jvm 명령 행 옵션을 변경하는 것입니다. – bmargulies

+0

System.loadLibrary()를 사용하여 라이브러리를로드하는 경우에만 해당할까요? 대신 System.load()를 사용하여 임시 파일의 경로를 제공하고 환경 및 java.library.path를 혼란스럽게하지 않아도됩니다. – JerryF

관련 문제