Java 我可以将本机DLL打包到WAR中吗?
我正在开发一个通过JNI使用本机代码的web服务。 我可以把那些dll打包到我的战争中吗?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
我已经厌倦了独立管理它们 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作为资源存储在WAR中,然后将其复制到文件系统上的某个位置。属性
java.io.tmpdir
应该指向一个可写目录,或者您可以使用File.createTempFile()
(只需确保对该文件调用deleteOnExit()
)。然后调用System.load()
,而不是System.loadLibary()
如果您完全可以控制部署,并且知道您将只部署到一台机器上,那么这不是问题。否则,您需要编写代码来确定要加载哪个库
这是一件会伤害您的事情:当您加载共享库时,它会链接到JVM的可执行代码中。您不能重新加载同一个库,这意味着您不能重新部署
当我上次不得不加载一个共享库来支持一个web应用程序时,我最终把它放在了AppServers共享目录中。这样做要容易得多。@carlspring:您必须幸运地拥有对java.library.path中任何目录的写访问权。(即Program Files\Java等)更好的做法可能是将dll解包到临时目录,并在运行时将此目录添加到Java.library.path。这是可能的:您正在使用哪个应用程序服务器?您能建议一个修复方法吗?修复方法是从文件系统加载它们,即您在问题中所说的“独立管理它们”。我正在尝试编写代码以读取war文件并提取dll文件。但问题是我无法阅读战争文件。你能建议点什么吗