Java 在webapp中使用本机Maven工件(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工件: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依赖性,那
<?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应用程序中加载同一个库,或者使用热重部署,则可以。