Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在webapp中使用本机Maven工件(nar)_Java_Maven_Java Native Interface_Native_Maven Nar Plugin - Fatal编程技术网

Java 在webapp中使用本机Maven工件(nar)

Java 在webapp中使用本机Maven工件(nar),java,maven,java-native-interface,native,maven-nar-plugin,Java,Maven,Java Native Interface,Native,Maven Nar Plugin,我有一个本机共享库,它是使用maven nar插件构建和打包的。这在Linux/MacOSX/Windows上运行良好。我还定义了一个JNI库,它也是使用maven nar构建的,用于封装共享库。这两个都是作为NAR工件生成的,需要使用maven NAR插件 当从非NAR打包项目中声明对这些NAR的依赖关系时,会出现问题。maven nar插件似乎从未被调用过。只有当我将项目的打包更改为NAR时,maven NAR插件才会生效。这使得NAR包装似乎需要具有传染性才能工作,如果存在NAR依赖性,那

我有一个本机共享库,它是使用maven nar插件构建和打包的。这在Linux/MacOSX/Windows上运行良好。我还定义了一个JNI库,它也是使用maven nar构建的,用于封装共享库。这两个都是作为NAR工件生成的,需要使用maven NAR插件

当从非NAR打包项目中声明对这些NAR的依赖关系时,会出现问题。maven nar插件似乎从未被调用过。只有当我将项目的打包更改为NAR时,maven NAR插件才会生效。这使得NAR包装似乎需要具有传染性才能工作,如果存在NAR依赖性,那么所有上游项目都需要NAR包装。这是正确的还是我遗漏了什么

使用maven nar插件生成的本机共享库和JNI工件能否成功地用于web应用程序,即WARs?如果它们可以在战争中使用和部署,如何做到这一点?否则,是否只有手动将本机库放置在应用服务器上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>

4.0.0
小组
家长
1.0-快照
../pom.xml
法官
罐子
好名字
...
真的
...
org.apache.maven.plugins
maven nar插件
2.1-快照
...
thegoup
蒂吉尼
1.0-快照
纳尔
...

不,或者至少不容易

如果您有JNI,您需要处理-Djava.library.path和LD_library_path/DYLD_library_path/path,以及启动整个容器时必须处理的所有事情。没有任何机制可以将所有这些从战争内部传播到容器中

在成熟的JavaEE中,JCA模型是/是用来将本机代码集成到web应用程序中的方式。但是典型的轻量级容器不支持它

如果您的本机代码不依赖于其他共享lib,并且您不关心JVM本机代码冲突(给定的本机类只能在一个类装入器中),那么您的问题仅仅是将共享对象放入war文件中


这是一种方法。使用maven依赖插件将共享库放到${project.build.directory}下的某个目录中,然后将它们作为“web资源”提取。

否,或者至少不容易

如果您有JNI,您需要处理-Djava.library.path和LD_library_path/DYLD_library_path/path,以及启动整个容器时必须处理的所有事情。没有任何机制可以将所有这些从战争内部传播到容器中

在成熟的JavaEE中,JCA模型是/是用来将本机代码集成到web应用程序中的方式。但是典型的轻量级容器不支持它

如果您的本机代码不依赖于其他共享lib,并且您不关心JVM本机代码冲突(给定的本机类只能在一个类装入器中),那么您的问题仅仅是将共享对象放入war文件中


这是一种方法。使用maven依赖插件将共享库放到${project.build.directory}下的某个目录中,然后将它们作为“web资源”提取。

您能发布相关的pom片段吗?应该可以将本机库声明为
war
类型项目的依赖项。您可以发布相关的pom片段吗?应该可以将本机库声明为
war
类型项目的依赖项。因此,唯一的方法是将特定于平台的共享库提取到临时文件中,并使用某种自定义加载程序加载它们?根据需要通过依赖项进行递归以提取和加载其本机库。这并不能解决问题。您的大问题是在Tomcat或其他任何东西启动时更改jvm命令行选项。如果我使用System.loadLibrary()来加载库,这不是唯一的情况吗?我可以改为使用System.load(),并提供临时文件的路径,避免弄乱环境和java.library.path。如果您的库对其他库没有依赖性,并且如果您从未尝试在两个Web应用程序中加载同一个库,或者使用热重部署,那么,唯一的方法是将特定于平台的共享库提取到临时文件中,并使用某种自定义加载程序加载它们?根据需要通过依赖项进行递归以提取和加载其本机库。这并不能解决问题。您的大问题是在Tomcat或其他任何东西启动时更改jvm命令行选项。如果我使用System.loadLibrary()来加载库,这不是唯一的情况吗?我可以改为使用System.load(),并提供临时文件的路径,从而避免与环境和java.library.path发生冲突。如果您的库对其他库没有依赖性,并且如果您从未尝试在两个Web应用程序中加载同一个库,或者使用热重部署,则可以。