Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.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 我可以将本机DLL打包到WAR中吗?_Java_Maven_Java Native Interface - Fatal编程技术网

Java 我可以将本机DLL打包到WAR中吗?

Java 我可以将本机DLL打包到WAR中吗?,java,maven,java-native-interface,Java,Maven,Java Native Interface,我正在开发一个通过JNI使用本机代码的web服务。 我可以把那些dll打包到我的战争中吗? 我已经厌倦了独立管理它们 PS我正在使用maven。 PPS我使用的Tomcat 7.x所有来自src/main/webapp的文件都打包到根目录下的war,所有来自src/main/resources的文件都打包到WEB-INF/classes。您可以打包所需内容DLL文件不是通过类路径加载的。类路径机制仅用于加载类文件和其他属性文件等java资源 一种方法是指定DLL的完整路径或使用java.libr

我正在开发一个通过JNI使用本机代码的web服务。 我可以把那些dll打包到我的战争中吗?
我已经厌倦了独立管理它们

PS我正在使用maven。

PPS我使用的Tomcat 7.x

所有来自
src/main/webapp
的文件都打包到根目录下的war,所有来自
src/main/resources
的文件都打包到
WEB-INF/classes
。您可以打包所需内容

DLL文件不是通过类路径加载的。类路径机制仅用于加载类文件和其他属性文件等java资源


一种方法是指定DLL的完整路径或使用
java.library.path
系统变量指定它。请查看更多详细信息

不,你不能。DLL必须从文件系统加载。您需要(1)严格保证应用程序服务器将WAR解包到文件系统,以及(2)知道DLL将解包到文件系统上的确切位置,以便您可以使用正确的文件名调用
system.load()

如果您的依赖项没有提供
,它将被包含在war文件中,无论类型如何(jar、zip等,除非它是另一个war)

虽然这是真的,但问题是您需要在
java.library.path
上安装本机库(
.so
.dll
)。EJP的担忧是正确的。但是,如果您使用汇编插件并将dll放在war文件的
/META-INF
目录下,您可以很容易地找到一些代码,从类路径
/META-INF/my.dll
中提取该dll,并将其放在
java.library.path
上的目录中


这与良好实践相差甚远,但我相信你可以像这样解决它。

是的,但你会遇到很多问题

  • DLL是从文件系统加载的,而不是从类路径加载的
    这不是一个严重的问题:只需将DLL作为资源存储在WAR中,然后将其复制到文件系统上的某个位置。属性
    java.io.tmpdir
    应该指向一个可写目录,或者您可以使用
    File.createTempFile()
    (只需确保对该文件调用
    deleteOnExit()
    )。然后调用
    System.load()
    ,而不是
    System.loadLibary()

  • 您必须为不同的体系结构管理DLL的不同副本
    如果您完全可以控制部署,并且知道您将只部署到一台机器上,那么这不是问题。否则,您需要编写代码来确定要加载哪个库

  • 您只能加载一次共享库
    这是一件会伤害您的事情:当您加载共享库时,它会链接到JVM的可执行代码中。您不能重新加载同一个库,这意味着您不能重新部署


  • 当我上次不得不加载一个共享库来支持一个web应用程序时,我最终把它放在了AppServers共享目录中。这样做要容易得多。

    @carlspring:您必须幸运地拥有对java.library.path中任何目录的写访问权。(即Program Files\Java等)更好的做法可能是将dll解包到临时目录,并在运行时将此目录添加到Java.library.path。这是可能的:

    您正在使用哪个应用程序服务器?您能建议一个修复方法吗?修复方法是从文件系统加载它们,即您在问题中所说的“独立管理它们”。我正在尝试编写代码以读取war文件并提取dll文件。但问题是我无法阅读战争文件。你能建议点什么吗